Backed out 16 changesets (bug 1922506) for causing mochitests failures in CanvasRenderingContext2DBinding.cpp. CLOSED TREE

Backed out changeset 92b3d2b856ee (bug 1922506)
Backed out changeset f2cd605cd97c (bug 1922506)
Backed out changeset c0cea90ae140 (bug 1922506)
Backed out changeset d0845b56ac6a (bug 1922506)
Backed out changeset bd50b07c6b5e (bug 1922506)
Backed out changeset cdf3f8bbee31 (bug 1922506)
Backed out changeset 4e39fe895fce (bug 1922506)
Backed out changeset 54c7bbd4ef7b (bug 1922506)
Backed out changeset 20022200a9e2 (bug 1922506)
Backed out changeset 1cd8a6b38919 (bug 1922506)
Backed out changeset f6a010cad98c (bug 1922506)
Backed out changeset 8ff25b5fa6b7 (bug 1922506)
Backed out changeset 40a9d6da9b92 (bug 1922506)
Backed out changeset 1c6bbaf3c6e3 (bug 1922506)
Backed out changeset 70c7cf0df998 (bug 1922506)
Backed out changeset 4d87de8944a9 (bug 1922506)
This commit is contained in:
Stanca Serban 2024-11-07 19:25:40 +02:00
parent 9e56e87df8
commit bff77eff39
24 changed files with 732 additions and 1031 deletions

View File

@ -1128,30 +1128,6 @@ void CanvasRenderingContext2D::GetContextAttributes(
// those just keep their default values.
}
void CanvasRenderingContext2D::GetDebugInfo(
bool aEnsureTarget, CanvasRenderingContext2DDebugInfo& aDebugInfo,
ErrorResult& aError) {
if (aEnsureTarget && !EnsureTarget(aError)) {
return;
}
if (!mBufferProvider) {
aError.ThrowInvalidStateError("No buffer provider available");
return;
}
if (!mTarget) {
aError.ThrowInvalidStateError("No target available");
return;
}
aDebugInfo = CanvasRenderingContext2DDebugInfo();
aDebugInfo.mIsAccelerated = mBufferProvider->IsAccelerated();
aDebugInfo.mIsShared = mBufferProvider->IsShared();
aDebugInfo.mBackendType = static_cast<int8_t>(mTarget->GetBackendType());
aDebugInfo.mDrawTargetType = static_cast<int8_t>(mTarget->GetType());
}
CanvasRenderingContext2D::ColorStyleCacheEntry
CanvasRenderingContext2D::ParseColorSlow(const nsACString& aString) {
ColorStyleCacheEntry result{nsCString(aString)};

View File

@ -99,10 +99,6 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
void GetContextAttributes(CanvasRenderingContext2DSettings& aSettings) const;
void GetDebugInfo(bool aEnsureTarget,
CanvasRenderingContext2DDebugInfo& aDebugInfo,
ErrorResult& aError);
void OnMemoryPressure() override;
void OnBeforePaintTransaction() override;
void OnDidPaintTransaction() override;

View File

@ -2429,7 +2429,6 @@ void ClientWebGLContext::GetParameter(JSContext* cx, GLenum pname,
case LOCAL_GL_RENDERER:
case LOCAL_GL_VENDOR:
case LOCAL_GL_VERSION:
case dom::MOZ_debug_Binding::CONTEXT_TYPE:
case dom::MOZ_debug_Binding::WSI_INFO:
debugOnly = true;
asString = true;

View File

@ -2226,25 +2226,6 @@ Maybe<std::string> WebGLContext::GetString(const GLenum pname) const {
return Some(std::string(info.BeginReading()));
}
case dom::MOZ_debug_Binding::CONTEXT_TYPE: {
gl::GLContextType ctxType = gl->GetContextType();
switch (ctxType) {
case gl::GLContextType::Unknown:
return Some("unknown"_ns);
case gl::GLContextType::WGL:
return Some("wgl"_ns);
case gl::GLContextType::CGL:
return Some("cgl"_ns);
case gl::GLContextType::GLX:
return Some("glx"_ns);
case gl::GLContextType::EGL:
return Some("egl"_ns);
case gl::GLContextType::EAGL:
return Some("eagl"_ns);
}
return Some("unknown"_ns);
}
default:
ErrorInvalidEnumArg("pname", pname);
return {};

View File

@ -35,21 +35,10 @@ dictionary CanvasRenderingContext2DSettings {
// whether or not we're planning to do a lot of readback operations
boolean willReadFrequently = false;
[Func="nsRFPService::IsSystemPrincipalOrAboutFingerprintingProtection"]
[Func="nsRFPService::IsSoftwareRenderingOptionExposed"]
boolean forceSoftwareRendering = false;
};
[GenerateInit]
dictionary CanvasRenderingContext2DDebugInfo {
required boolean isAccelerated;
required boolean isShared;
required byte backendType;
required byte drawTargetType;
};
dictionary HitRegionOptions {
Path2D? path = null;
DOMString id = "";
@ -75,9 +64,6 @@ interface CanvasRenderingContext2D {
CanvasRenderingContext2DSettings getContextAttributes();
[Throws, Func="nsRFPService::IsSystemPrincipalOrAboutFingerprintingProtection"]
CanvasRenderingContext2DDebugInfo getDebugInfo(optional boolean ensureTarget = false);
// Show the caret if appropriate when drawing
[Func="CanvasUtils::HasDrawWindowPrivilege"]
const unsigned long DRAWWINDOW_DRAW_CARET = 0x01;

View File

@ -53,7 +53,7 @@ dictionary WebGLContextAttributes {
GLboolean failIfMajorPerformanceCaveat = false;
WebGLPowerPreference powerPreference = "default";
[Func="nsRFPService::IsSystemPrincipalOrAboutFingerprintingProtection"]
[Func="nsRFPService::IsSoftwareRenderingOptionExposed"]
GLboolean forceSoftwareRendering = false;
};
@ -1165,7 +1165,6 @@ interface MOZ_debug {
const GLenum WSI_INFO = 0x10000;
const GLenum UNPACK_REQUIRE_FASTPATH = 0x10001;
const GLenum DOES_INDEX_VALIDATION = 0x10002;
const GLenum CONTEXT_TYPE = 0x10003;
[Throws]
any getParameter(GLenum pname);

View File

@ -30,15 +30,6 @@ inline std::shared_ptr<EglDisplay> DefaultEglDisplay(
return lib->DefaultDisplay(out_failureId);
}
inline std::shared_ptr<EglDisplay> CreateSoftwareEglDisplay(
nsACString* const out_failureId) {
const auto lib = GLLibraryEGL::Get(out_failureId);
if (!lib) {
return nullptr;
}
return lib->CreateDisplay(false, true, out_failureId);
}
// -
class GLContextEGL final : public GLContext {

View File

@ -1242,11 +1242,7 @@ void GLContextEGL::DestroySurface(EglDisplay& aEgl, const EGLSurface aSurface) {
/*static*/
already_AddRefed<GLContext> GLContextProviderEGL::CreateHeadless(
const GLContextCreateDesc& desc, nsACString* const out_failureId) {
bool useSoftwareDisplay =
static_cast<bool>(desc.flags & CreateContextFlags::FORBID_HARDWARE);
const auto display = useSoftwareDisplay
? CreateSoftwareEglDisplay(out_failureId)
: DefaultEglDisplay(out_failureId);
const auto display = DefaultEglDisplay(out_failureId);
if (!display) {
return nullptr;
}

View File

@ -888,6 +888,10 @@ static already_AddRefed<GLContextGLX> CreateOffscreenPixmapContext(
auto fullDesc = GLContextDesc{desc};
fullDesc.isOffscreen = true;
if (fullDesc.flags & CreateContextFlags::FORBID_HARDWARE) {
fullDesc.flags |= CreateContextFlags::REQUIRE_COMPAT_PROFILE;
}
return GLContextGLX::CreateGLContext(fullDesc, display, pixmap, config,
drawable);
}

View File

@ -35,10 +35,7 @@ already_AddRefed<GLContext> GLContextProviderLinux::CreateForCompositorWidget(
/*static*/
already_AddRefed<GLContext> GLContextProviderLinux::CreateHeadless(
const GLContextCreateDesc& desc, nsACString* const out_failureId) {
if (gfxVars::UseEGL() ||
bool(desc.flags & CreateContextFlags::FORBID_HARDWARE)) {
// We request EGL if software is required, because we don't know
// what X11 is using. It could be software or hardware.
if (gfxVars::UseEGL()) {
return sGLContextProviderEGL.CreateHeadless(desc, out_failureId);
#ifdef MOZ_X11
} else {

View File

@ -475,21 +475,6 @@ already_AddRefed<GLContext> GLContextProviderWGL::CreateHeadless(
bool forbidHardware =
static_cast<bool>(desc.flags & CreateContextFlags::FORBID_HARDWARE);
if (!foundFormats && forbidHardware) {
const int kAttribs[] = {LOCAL_WGL_DRAW_TO_PBUFFER_ARB,
true,
LOCAL_WGL_SUPPORT_OPENGL_ARB,
true,
LOCAL_WGL_ACCELERATION_ARB,
LOCAL_WGL_NO_ACCELERATION_ARB,
0};
if (!wgl.mSymbols.fChoosePixelFormat(wgl.RootDc(), kAttribs, nullptr, 1,
&chosenFormat, &foundFormats)) {
foundFormats = 0;
return nullptr;
}
}
if (!foundFormats && !forbidHardware) {
const int kAttribs[] = {LOCAL_WGL_DRAW_TO_PBUFFER_ARB,
true,
LOCAL_WGL_SUPPORT_OPENGL_ARB,

View File

@ -938,14 +938,14 @@ std::shared_ptr<EglDisplay> GLLibraryEGL::CreateDisplayLocked(
ret = GetAndInitSoftwareDisplay(*this, aProofOfLock);
}
// Initialize the display the normal way
if (!ret && !gdk_display_get_default() && !forceSoftware) {
if (!ret && !gdk_display_get_default()) {
ret = GetAndInitDeviceDisplay(*this, aProofOfLock);
if (!ret) {
ret = GetAndInitSurfacelessDisplay(*this, aProofOfLock);
}
}
# ifdef MOZ_WAYLAND
else if (!ret && widget::GdkIsWaylandDisplay() && !forceSoftware) {
else if (!ret && widget::GdkIsWaylandDisplay()) {
// Wayland does not support EGL_DEFAULT_DISPLAY
nativeDisplay = widget::WaylandDisplayGetWLDisplay();
if (!nativeDisplay) {
@ -955,7 +955,7 @@ std::shared_ptr<EglDisplay> GLLibraryEGL::CreateDisplayLocked(
}
# endif
#endif
if (!ret && !forceSoftware) {
if (!ret) {
ret = GetAndInitDisplay(*this, nativeDisplay, aProofOfLock);
}
}

File diff suppressed because one or more lines are too long

View File

@ -59,5 +59,4 @@ class UserCharacteristicsParent extends JSWindowActorParent {
export {
UserCharacteristicsParent,
UserCharacteristicsParent as UserCharacteristicsWindowInfoParent,
UserCharacteristicsParent as UserCharacteristicsCanvasRenderingParent,
};

View File

@ -133,7 +133,7 @@ export class UserCharacteristicsWindowInfoChild extends JSWindowActorChild {
didDestroy() {
this.destroyed = true;
for (const [type, handler] of Object.entries(this.handlers)) {
this.contentWindow?.windowRoot?.removeEventListener(type, handler);
this.contentWindow.windowRoot.removeEventListener(type, handler);
}
}

View File

@ -75,7 +75,6 @@ FINAL_TARGET_FILES.actors += [
"UAWidgetsChild.sys.mjs",
"UnselectedTabHoverChild.sys.mjs",
"UnselectedTabHoverParent.sys.mjs",
"UserCharacteristicsCanvasRenderingChild.sys.mjs",
"UserCharacteristicsChild.sys.mjs",
"UserCharacteristicsParent.sys.mjs",
"UserCharacteristicsWindowInfoChild.sys.mjs",

View File

@ -61,7 +61,6 @@ export class UserCharacteristicsPageService {
return;
}
this._initialized = true;
this.handledErrors = [];
}
shutdown() {}
@ -121,25 +120,13 @@ export class UserCharacteristicsPageService {
"user-characteristics-populating-data-done"
);
} finally {
lazy.console.debug("Unregistering actors");
this.cleanUp();
lazy.console.debug("Cleanup done");
lazy.console.debug("Unregistering actor");
ChromeUtils.unregisterWindowActor("UserCharacteristics");
this._backgroundBrowsers.delete(browser);
lazy.console.debug("Background browser removed");
}
});
}
cleanUp() {
ChromeUtils.unregisterWindowActor("UserCharacteristics");
// unregisterWindowActor doesn't throw if the actor is not registered.
// (Do note it console.error's but doesn't throw)
// We can safely double unregister. We do this to handle the case where
// the actor was registered but the function it was registered timed out.
ChromeUtils.unregisterWindowActor("UserCharacteristicsWindowInfo");
ChromeUtils.unregisterWindowActor("UserCharacteristicsCanvasRendering");
}
async populateAndCollectErrors(browser, data) {
// List of functions to populate Glean metrics
const populateFuncs = [
@ -153,15 +140,7 @@ export class UserCharacteristicsPageService {
[this.populateClientInfo, []],
[this.populateCPUInfo, []],
[this.populateWindowInfo, []],
[
this.populateWebGlInfo,
[browser.ownerGlobal, browser.ownerDocument, false],
],
[
this.populateWebGlInfo,
[browser.ownerGlobal, browser.ownerDocument, true],
],
[this.populateCanvasData, []],
[this.populateWebGlInfo, [browser.ownerGlobal, browser.ownerDocument]],
];
// Bind them to the class and run them in parallel.
// Timeout if any of them takes too long (5 minutes).
@ -183,17 +162,12 @@ export class UserCharacteristicsPageService {
}
}
errors.push(...this.handledErrors);
Glean.characteristics.jsErrors.set(JSON.stringify(errors));
}
async collectGleanMetricsFromMap(
data,
{ prefix = "", suffix = "", operation = "set" } = {}
) {
async collectGleanMetricsFromMap(data, operation = "set") {
for (const [key, value] of Object.entries(data)) {
Glean.characteristics[prefix + key + suffix][operation](value);
Glean.characteristics[key][operation](value);
}
}
@ -257,14 +231,10 @@ export class UserCharacteristicsPageService {
for (const win of Services.wm.getEnumerator("navigator:browser")) {
if (!win.closed) {
for (const tab of win.gBrowser.tabs) {
const actor = await promiseTry(() =>
const actor =
tab.linkedBrowser.browsingContext?.currentWindowGlobal.getActor(
"UserCharacteristicsWindowInfo"
)
).catch(async e => {
lazy.console.error("Error getting actor", e);
this.handledErrors.push(await stringifyError(e));
});
);
if (!actor) {
continue;
@ -282,137 +252,6 @@ export class UserCharacteristicsPageService {
this.collectGleanMetricsFromMap(pointerResult);
}
async populateCanvasData() {
const actorName = "UserCharacteristicsCanvasRendering";
ChromeUtils.registerWindowActor(actorName, {
parent: {
esModuleURI: "resource://gre/actors/UserCharacteristicsParent.sys.mjs",
},
child: {
esModuleURI:
"resource://gre/actors/UserCharacteristicsCanvasRenderingChild.sys.mjs",
},
});
let data = {};
// Returns true if we need to try again
const attemptRender = async () => {
const diagnostics = {
count: 0,
closed: 0,
noActor: 0,
noDebugInfo: 0,
notHW: 0,
};
// Try to find a window that supports hardware rendering
let foundActor = null;
let fallbackActor = null;
for (const win of Services.wm.getEnumerator("navigator:browser")) {
diagnostics.count++;
if (win.closed) {
diagnostics.closed++;
continue;
}
const actor =
win.gBrowser.selectedBrowser.browsingContext?.currentWindowGlobal.getActor(
actorName
);
if (!actor) {
diagnostics.noActor++;
continue;
}
// Example data: {"backendType":3,"drawTargetType":0,"isAccelerated":false,"isShared":true}
const debugInfo = await timeoutPromise(
actor.sendQuery("CanvasRendering:GetDebugInfo"),
5000
).catch(async e => {
lazy.console.error("Canvas rendering debug info failed", e);
this.handledErrors.push(await stringifyError(e));
});
if (!debugInfo) {
diagnostics.noDebugInfo++;
continue;
}
lazy.console.debug("Canvas rendering debug info", debugInfo);
fallbackActor = actor;
if (debugInfo.isAccelerated) {
foundActor = actor;
break;
}
diagnostics.notHW++;
}
// If we didn't find a hardware accelerated window, we use the last one
const actor = foundActor || fallbackActor;
if (!actor) {
lazy.console.error("No actor found for canvas rendering");
// There's no actor/window to render canvases
return { error: { message: "NO_ACTOR", diagnostics }, retry: false };
}
// We have an actor, hw accelerated or not
// Ask it to render the canvases.
// Timeout after 1 minute to give multiple
// chances to render canvases.
try {
data = await timeoutPromise(
actor.sendQuery("CanvasRendering:Render", {
hwRenderingExpected: !!foundActor,
}),
1 * 60 * 1000
);
} catch (e) {
lazy.console.error(
"Canvas rendering timed out or actor was destroyed (tab closed etc.)",
e
);
return {
error: { message: await stringifyError(e), diagnostics },
retry: true,
};
}
// Successfully rendered at least some canvases, maybe all of them
return {
error:
!foundActor && fallbackActor
? { message: "NO_HW_ACTOR", diagnostics }
: null,
retry: false,
};
};
// Try to render canvases
let result = null;
while ((result = await attemptRender()).retry) {
this.handledErrors.push(result.error);
// If we failed to render canvases, try again.
// This can happen if the user closes the tab before we render the canvases.
// Wait for a bit before trying again
await new Promise(resolve => lazy.setTimeout(resolve, 5 * 1000));
}
if (!result.retry && result.error) {
this.handledErrors.push(result.error);
}
// We may have HW + SW, or only SW rendered canvases - populate the metrics with what we have
this.collectGleanMetricsFromMap(data.renderings);
ChromeUtils.unregisterWindowActor(actorName);
// Record the errors
if (data.errors?.length) {
this.handledErrors.push(...data.errors);
}
}
async populateZoomPrefs() {
const zoomPrefsCount = await new Promise(resolve => {
lazy.contentPrefs.getByName("browser.content.full-zoom", null, {
@ -457,8 +296,32 @@ export class UserCharacteristicsPageService {
// usercharacteristics.js and the metric defined
const metrics = {
set: [
"canvasdata1",
"canvasdata2",
"canvasdata3",
"canvasdata4",
"canvasdata5",
"canvasdata6",
"canvasdata7",
"canvasdata8",
"canvasdata9",
"canvasdata10",
"canvasdata11Webgl",
"canvasdata12Fingerprintjs1",
"canvasdata13Fingerprintjs2",
"canvasdata1software",
"canvasdata2software",
"canvasdata3software",
"canvasdata4software",
"canvasdata5software",
"canvasdata6software",
"canvasdata7software",
"canvasdata8software",
"canvasdata9software",
"canvasdata10software",
"canvasdata11Webglsoftware",
"canvasdata12Fingerprintjs1software",
"canvasdata13Fingerprintjs2software",
"voicesCount",
"voicesLocalCount",
"voicesDefault",
@ -574,7 +437,7 @@ export class UserCharacteristicsPageService {
);
}
async populateWebGlInfo(window, document, forceSoftwareRendering) {
async populateWebGlInfo(window, document) {
const results = {
glVersion: 2,
parameters: {
@ -591,16 +454,17 @@ export class UserCharacteristicsPageService {
};
const canvas = document.createElement("canvas");
let gl = canvas.getContext("webgl2", { forceSoftwareRendering });
let gl = canvas.getContext("webgl2");
if (!gl) {
gl = canvas.getContext("webgl", { forceSoftwareRendering });
gl = canvas.getContext("webgl");
results.glVersion = 1;
}
if (!gl) {
lazy.console.error(
"Unable to initialize WebGL. Your browser or machine may not support it."
);
Glean.characteristics.glVersion.set(results.glVersion);
results.glVersion = 0;
Glean.characteristics.webglinfo.set(JSON.stringify(results));
return;
}
@ -736,7 +600,6 @@ export class UserCharacteristicsPageService {
extensionsRaw: mozDebugExt.getParameter(mozDebugExt.EXTENSIONS),
vendorDebugInfo: gl.getParameter(debugExt.UNMASKED_VENDOR_WEBGL),
rendererDebugInfo: gl.getParameter(debugExt.UNMASKED_RENDERER_WEBGL),
contextType: mozDebugExt.getParameter(mozDebugExt.CONTEXT_TYPE),
};
if (gl.getExtension("WEBGL_debug_shaders")) {
@ -801,36 +664,35 @@ export class UserCharacteristicsPageService {
};
}
const map = {
// General
glVersion: results.glVersion,
// Debug Params
glExtensions: results.debugParams.extensions,
glExtensionsRaw: results.debugParams.extensionsRaw,
glRenderer: results.debugParams.rendererDebugInfo,
glRendererRaw: results.debugParams.rendererRaw,
glVendor: results.debugParams.vendorDebugInfo,
glVendorRaw: results.debugParams.vendorRaw,
glVersionRaw: results.debugParams.versionRaw,
glContextType: results.debugParams.contextType,
// Debug Shaders
glFragmentShader: results.debugShaders.fs,
glVertexShader: results.debugShaders.vs,
glMinimalSource: results.debugShaders.ms,
// Parameters
glParamsExtensions: JSON.stringify(results.parameters.extensions),
glParamsV1: JSON.stringify(results.parameters.v1),
glParamsV2: JSON.stringify(results.parameters.v2),
// Shader Precision
glPrecisionFragment: JSON.stringify(
results.shaderPrecision.FRAGMENT_SHADER
),
glPrecisionVertex: JSON.stringify(results.shaderPrecision.VERTEX_SHADER),
};
this.collectGleanMetricsFromMap(map, {
suffix: forceSoftwareRendering ? "Software" : "",
});
// General
Glean.characteristics.glVersion.set(results.glVersion);
// Debug Params
Glean.characteristics.glExtensions.set(results.debugParams.extensions);
Glean.characteristics.glExtensionsRaw.set(
results.debugParams.extensionsRaw
);
Glean.characteristics.glRenderer.set(results.debugParams.rendererDebugInfo);
Glean.characteristics.glRendererRaw.set(results.debugParams.rendererRaw);
Glean.characteristics.glVendor.set(results.debugParams.vendorDebugInfo);
Glean.characteristics.glVendorRaw.set(results.debugParams.vendorRaw);
Glean.characteristics.glVersionRaw.set(results.debugParams.versionRaw);
// Debug Shaders
Glean.characteristics.glFragmentShader.set(results.debugShaders.fs);
Glean.characteristics.glVertexShader.set(results.debugShaders.vs);
Glean.characteristics.glMinimalSource.set(results.debugShaders.ms);
// Parameters
Glean.characteristics.glParamsExtensions.set(
JSON.stringify(results.parameters.extensions)
);
Glean.characteristics.glParamsV1.set(JSON.stringify(results.parameters.v1));
Glean.characteristics.glParamsV2.set(JSON.stringify(results.parameters.v2));
// Shader Precision
Glean.characteristics.glPrecisionFragment.set(
JSON.stringify(results.shaderPrecision.FRAGMENT_SHADER)
);
Glean.characteristics.glPrecisionVertex.set(
JSON.stringify(results.shaderPrecision.VERTEX_SHADER)
);
}
async pageLoaded(browsingContext, data) {
@ -915,13 +777,3 @@ function timeoutPromise(promise, ms) {
);
});
}
function promiseTry(func) {
return new Promise((resolve, reject) => {
try {
resolve(func());
} catch (error) {
reject(error);
}
});
}

File diff suppressed because one or more lines are too long

View File

@ -21,6 +21,181 @@
<body>
<div id="test_canvases">
<h2>Test Canvases</h2>
<div>
<h3>Canvas 1</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas1"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas1data" id="canvas1data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 2</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas2"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas2data" id="canvas2data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 3</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas3"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas3data" id="canvas3data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 4</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas4"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas4data" id="canvas4data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 5</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas5"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas5data" id="canvas5data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 6</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas6"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas6data" id="canvas6data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 7</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas7"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas7data" id="canvas7data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 8</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas8"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas8data" id="canvas8data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 9</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas9"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas9data" id="canvas9data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 10</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas10"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input
type="text"
name="canvas10data"
id="canvas10data"
readonly
/>
</td>
</tr>
</table>
</div>
<div>
<h3>WebGL Canvas</h3>
<canvas
@ -43,9 +218,228 @@
</tr>
</table>
</div>
<div>
<h3>FingerprintJS Canvas 1 (Text)</h3>
<canvas
class="testcanvas"
width="240"
height="60"
id="fingerprintjscanvas1"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input
type="text"
name="fingerprintjscanvas1data"
id="fingerprintjscanvas1data"
readonly
/>
</td>
</tr>
</table>
</div>
<div>
<h3>FingerprintJS Canvas 2 (Geometry)</h3>
<canvas
class="testcanvas"
width="122"
height="110"
id="fingerprintjscanvas2"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input
type="text"
name="fingerprintjscanvas2data"
id="fingerprintjscanvas2data"
readonly
/>
</td>
</tr>
</table>
</div>
</div>
<div id="test_canvases">
<h2>Test Canvases Software</h2>
<div>
<h3>Canvas 1</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas1software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas1data" id="canvas1data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 2</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas2software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas2data" id="canvas2data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 3</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas3software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas3data" id="canvas3data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 4</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas4software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas4data" id="canvas4data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 5</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas5software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas5data" id="canvas5data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 6</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas6software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas6data" id="canvas6data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 7</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas7software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas7data" id="canvas7data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 8</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas8software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas8data" id="canvas8data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 9</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas9software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input type="text" name="canvas9data" id="canvas9data" readonly />
</td>
</tr>
</table>
</div>
<div>
<h3>Canvas 10</h3>
<canvas
class="testcanvas"
width="250"
height="250"
id="canvas10software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input
type="text"
name="canvas10data"
id="canvas10data"
readonly
/>
</td>
</tr>
</table>
</div>
<div>
<h3>WebGL Canvas</h3>
<canvas
@ -68,6 +462,50 @@
</tr>
</table>
</div>
<div>
<h3>FingerprintJS Canvas 1 (Text)</h3>
<canvas
class="testcanvas"
width="240"
height="60"
id="fingerprintjscanvas1software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input
type="text"
name="fingerprintjscanvas1data"
id="fingerprintjscanvas1data"
readonly
/>
</td>
</tr>
</table>
</div>
<div>
<h3>FingerprintJS Canvas 2 (Geometry)</h3>
<canvas
class="testcanvas"
width="122"
height="110"
id="fingerprintjscanvas2software"
></canvas>
<table>
<tr>
<td>ImageData:</td>
<td>
<input
type="text"
name="fingerprintjscanvas2data"
id="fingerprintjscanvas2data"
readonly
/>
</td>
</tr>
</table>
</div>
</div>
<!--

File diff suppressed because one or more lines are too long

View File

@ -2018,329 +2018,6 @@ characteristics:
# is more like 'technical' (per the Data Review), I'm marking highly sensitive.
- highly_sensitive
gl_context_type:
type: string
description: >
The type of the GL context (EGL, GLX, WGL, etc).
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c17
expires: never
data_sensitivity:
- technical
gl_version_software:
type: quantity
unit: int
description: >
The version of OpenGL supported by the user's system.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
- technical
gl_extensions_software:
type: text
description: >
The list of OpenGL extensions supported by the user's system.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
# Text metrics are _required_ to be web_activity or highly_sensitive, so even though this
# is more like 'technical' (per the Data Review), I'm marking highly sensitive.
- highly_sensitive
gl_extensions_raw_software:
type: text
description: >
The raw list of OpenGL extensions supported by the user's system.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
# Text metrics are _required_ to be web_activity or highly_sensitive, so even though this
# is more like 'technical' (per the Data Review), I'm marking highly sensitive.
- highly_sensitive
gl_renderer_software:
type: string
description: >
The OpenGL renderer string.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
- technical
gl_renderer_raw_software:
type: string
description: >
The raw OpenGL renderer string.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
- technical
gl_vendor_software:
type: string
description: >
The OpenGL vendor string.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
- technical
gl_vendor_raw_software:
type: string
description: >
The raw OpenGL vendor string.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
- technical
gl_version_raw_software:
type: string
description: >
The raw OpenGL version string.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
- technical
gl_fragment_shader_software:
type: string
description: >
Hash of the transformed source of the fragment shader.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
- technical
gl_vertex_shader_software:
type: string
description: >
Hash of the transformed source of the vertex shader.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
- technical
gl_minimal_source_software:
type: text
description: >
Transformed source of the minimal shader.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
# Text metrics are _required_ to be web_activity or highly_sensitive, so even though this
# is more like 'technical' (per the Data Review), I'm marking highly sensitive.
- highly_sensitive
gl_params_extensions_software:
type: text
description: >
The list of GL parameters of the extensions.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
# Text metrics are _required_ to be web_activity or highly_sensitive, so even though this
# is more like 'technical' (per the Data Review), I'm marking highly sensitive.
- highly_sensitive
gl_params_v1_software:
type: text
description: >
The list of GL parameters of GL1.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
# Text metrics are _required_ to be web_activity or highly_sensitive, so even though this
# is more like 'technical' (per the Data Review), I'm marking highly sensitive.
- highly_sensitive
gl_params_v2_software:
type: text
description: >
The list of GL parameters of GL2.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
# Text metrics are _required_ to be web_activity or highly_sensitive, so even though this
# is more like 'technical' (per the Data Review), I'm marking highly sensitive.
- highly_sensitive
gl_precision_fragment_software:
type: text
description: >
Precisions of the fragment shader.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
# Text metrics are _required_ to be web_activity or highly_sensitive, so even though this
# is more like 'technical' (per the Data Review), I'm marking highly sensitive.
- highly_sensitive
gl_precision_vertex_software:
type: text
description: >
Precisions of the vertex shader.
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c15
expires: never
data_sensitivity:
# Text metrics are _required_ to be web_activity or highly_sensitive, so even though this
# is more like 'technical' (per the Data Review), I'm marking highly sensitive.
- highly_sensitive
gl_context_type_software:
type: string
description: >
The type of the GL context (EGL, GLX, WGL, etc).
lifetime: application
send_in_pings:
- user-characteristics
notification_emails:
- tom@mozilla.com
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1922506#c17
expires: never
data_sensitivity:
- technical
prefs_network_cookie_cookiebehavior: # network.cookie.cookieBehavior
type: quantity
unit: int

View File

@ -1919,8 +1919,8 @@ bool nsRFPService::CheckSuspiciousFingerprintingActivity(
}
/* static */
bool nsRFPService::IsSystemPrincipalOrAboutFingerprintingProtection(
JSContext* aCx, JSObject* aObj) {
bool nsRFPService::IsSoftwareRenderingOptionExposed(JSContext* aCx,
JSObject* aObj) {
if (!NS_IsMainThread()) {
return false;
}

View File

@ -223,8 +223,7 @@ class nsRFPService final : public nsIObserver, public nsIRFPService {
bool aIsPrivateMode, RFPTarget aTarget,
const Maybe<RFPTarget>& aOverriddenFingerprintingSettings);
static bool IsSystemPrincipalOrAboutFingerprintingProtection(JSContext*,
JSObject*);
static bool IsSoftwareRenderingOptionExposed(JSContext*, JSObject*);
// --------------------------------------------------------------------------
static double TimerResolution(RTPCallerType aRTPCallerType);

View File

@ -667,7 +667,7 @@ const RefPtr<PopulatePromise>& TimoutPromise(
// metric is set, this variable should be incremented. It'll be a lot. It's
// okay. We're going to need it to know (including during development) what is
// the source of the data we are looking at.
const int kSubmissionSchema = 8;
const int kSubmissionSchema = 7;
const auto* const kUUIDPref =
"toolkit.telemetry.user_characteristics_ping.uuid";