--- a/js/public/TypeDecls.h
+++ b/js/public/TypeDecls.h
@@ -27,17 +27,16 @@ typedef uint8_t jsbytecode;
class JSAtom;
struct JSCompartment;
struct JSContext;
class JSFunction;
class JSObject;
struct JSRuntime;
class JSScript;
class JSString;
-class JSAddonId;
struct JSFreeOp;
struct jsid;
namespace JS {
typedef unsigned char Latin1Char;
--- a/js/src/gc/GC.cpp
+++ b/js/src/gc/GC.cpp
@@ -7960,19 +7960,16 @@ gc::MergeCompartments(JSCompartment* sou
void
GCRuntime::mergeCompartments(JSCompartment* source, JSCompartment* target)
{
// The source compartment must be specifically flagged as mergable. This
// also implies that the compartment is not visible to the debugger.
MOZ_ASSERT(source->creationOptions_.mergeable());
MOZ_ASSERT(source->creationOptions_.invisibleToDebugger());
- MOZ_ASSERT(source->creationOptions().addonIdOrNull() ==
- target->creationOptions().addonIdOrNull());
-
MOZ_ASSERT(!source->hasBeenEntered());
MOZ_ASSERT(source->zone()->compartments().length() == 1);
MOZ_ASSERT(source->zone()->group()->zones().length() == 1);
JSContext* cx = rt->activeContextFromOwnThread();
MOZ_ASSERT(!source->zone()->wasGCStarted());
JS::AutoAssertNoGC nogc(cx);
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -775,34 +775,16 @@ JS_MarkCrossZoneId(JSContext* cx, jsid i
}
JS_PUBLIC_API(void)
JS_MarkCrossZoneIdValue(JSContext* cx, const Value& value)
{
cx->markAtomValue(value);
}
-JS_PUBLIC_API(JSAddonId*)
-JS::NewAddonId(JSContext* cx, HandleString str)
-{
- return static_cast<JSAddonId*>(JS_AtomizeAndPinJSString(cx, str));
-}
-
-JS_PUBLIC_API(JSString*)
-JS::StringOfAddonId(JSAddonId* id)
-{
- return id;
-}
-
-JS_PUBLIC_API(JSAddonId*)
-JS::AddonIdOfObject(JSObject* obj)
-{
- return obj->compartment()->creationOptions().addonIdOrNull();
-}
-
JS_PUBLIC_API(void)
JS_SetZoneUserData(JS::Zone* zone, void* data)
{
zone->data = data;
}
JS_PUBLIC_API(void*)
JS_GetZoneUserData(JS::Zone* zone)
@@ -3988,17 +3970,17 @@ JS::TransitiveCompileOptions::copyPODTra
asmJSOption = rhs.asmJSOption;
throwOnAsmJSValidationFailureOption = rhs.throwOnAsmJSValidationFailureOption;
forceAsync = rhs.forceAsync;
sourceIsLazy = rhs.sourceIsLazy;
introductionType = rhs.introductionType;
introductionLineno = rhs.introductionLineno;
introductionOffset = rhs.introductionOffset;
hasIntroductionInfo = rhs.hasIntroductionInfo;
- isProbablySystemOrAddonCode = rhs.isProbablySystemOrAddonCode;
+ isProbablySystemCode = rhs.isProbablySystemCode;
hideScriptFromDebugger = rhs.hideScriptFromDebugger;
};
void
JS::ReadOnlyCompileOptions::copyPODOptions(const ReadOnlyCompileOptions& rhs)
{
copyPODTransitiveOptions(rhs);
lineno = rhs.lineno;
@@ -4102,17 +4084,17 @@ JS::OwningCompileOptions::setIntroducerF
JS::CompileOptions::CompileOptions(JSContext* cx)
: ReadOnlyCompileOptions(), elementRoot(cx), elementAttributeNameRoot(cx),
introductionScriptRoot(cx)
{
strictOption = cx->options().strictMode();
extraWarningsOption = cx->compartment()->behaviors().extraWarnings(cx);
expressionClosuresOption = cx->options().expressionClosures();
- isProbablySystemOrAddonCode = cx->compartment()->isProbablySystemOrAddonCode();
+ isProbablySystemCode = cx->compartment()->isProbablySystemCode();
werrorOption = cx->options().werror();
if (!cx->options().asmJS())
asmJSOption = AsmJSOption::Disabled;
else if (cx->compartment()->debuggerObservesAsmJS())
asmJSOption = AsmJSOption::DisabledByDebugger;
else
asmJSOption = AsmJSOption::Enabled;
throwOnAsmJSValidationFailureOption = cx->options().throwOnAsmJSValidationFailure();
--- a/js/src/jsapi.h
+++ b/js/src/jsapi.h
@@ -1981,36 +1981,27 @@ enum ZoneSpecifier {
*
* Access to these options on an existing compartment is read-only: if you
* need particular selections, make them before you create the compartment.
*/
class JS_PUBLIC_API(CompartmentCreationOptions)
{
public:
CompartmentCreationOptions()
- : addonId_(nullptr),
- traceGlobal_(nullptr),
+ : traceGlobal_(nullptr),
zoneSpec_(NewZoneInSystemZoneGroup),
zonePointer_(nullptr),
invisibleToDebugger_(false),
mergeable_(false),
preserveJitCode_(false),
cloneSingletons_(false),
sharedMemoryAndAtomics_(false),
secureContext_(false)
{}
- // A null add-on ID means that the compartment is not associated with an
- // add-on.
- JSAddonId* addonIdOrNull() const { return addonId_; }
- CompartmentCreationOptions& setAddonId(JSAddonId* id) {
- addonId_ = id;
- return *this;
- }
-
JSTraceOp getTrace() const {
return traceGlobal_;
}
CompartmentCreationOptions& setTrace(JSTraceOp op) {
traceGlobal_ = op;
return *this;
}
@@ -2067,17 +2058,16 @@ class JS_PUBLIC_API(CompartmentCreationO
// https://bugzilla.mozilla.org/show_bug.cgi?id=1162772#c34
bool secureContext() const { return secureContext_; }
CompartmentCreationOptions& setSecureContext(bool flag) {
secureContext_ = flag;
return *this;
}
private:
- JSAddonId* addonId_;
JSTraceOp traceGlobal_;
ZoneSpecifier zoneSpec_;
void* zonePointer_; // Per zoneSpec_, either a Zone, ZoneGroup, or null.
bool invisibleToDebugger_;
bool mergeable_;
bool preserveJitCode_;
bool cloneSingletons_;
bool sharedMemoryAndAtomics_;
@@ -3595,17 +3585,17 @@ class JS_FRIEND_API(TransitiveCompileOpt
extraWarningsOption(false),
expressionClosuresOption(false),
werrorOption(false),
asmJSOption(AsmJSOption::Disabled),
throwOnAsmJSValidationFailureOption(false),
forceAsync(false),
sourceIsLazy(false),
allowHTMLComments(true),
- isProbablySystemOrAddonCode(false),
+ isProbablySystemCode(false),
hideScriptFromDebugger(false),
introductionType(nullptr),
introductionLineno(0),
introductionOffset(0),
hasIntroductionInfo(false)
{ }
// Set all POD options (those not requiring reference counts, copies,
@@ -3631,17 +3621,17 @@ class JS_FRIEND_API(TransitiveCompileOpt
bool extraWarningsOption;
bool expressionClosuresOption;
bool werrorOption;
AsmJSOption asmJSOption;
bool throwOnAsmJSValidationFailureOption;
bool forceAsync;
bool sourceIsLazy;
bool allowHTMLComments;
- bool isProbablySystemOrAddonCode;
+ bool isProbablySystemCode;
bool hideScriptFromDebugger;
// |introductionType| is a statically allocated C string:
// one of "eval", "Function", or "GeneratorFunction".
const char* introductionType;
unsigned introductionLineno;
uint32_t introductionOffset;
bool hasIntroductionInfo;
@@ -4982,29 +4972,16 @@ class MOZ_RAII JSAutoByteString
char* mBytes;
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
/* Copy and assignment are not supported. */
JSAutoByteString(const JSAutoByteString& another);
JSAutoByteString& operator=(const JSAutoByteString& another);
};
-namespace JS {
-
-extern JS_PUBLIC_API(JSAddonId*)
-NewAddonId(JSContext* cx, JS::HandleString str);
-
-extern JS_PUBLIC_API(JSString*)
-StringOfAddonId(JSAddonId* id);
-
-extern JS_PUBLIC_API(JSAddonId*)
-AddonIdOfObject(JSObject* obj);
-
-} // namespace JS
-
/************************************************************************/
/*
* Symbols
*/
namespace JS {
/**
--- a/js/src/jsexn.cpp
+++ b/js/src/jsexn.cpp
@@ -773,77 +773,16 @@ ErrorReport::ErrorReport(JSContext* cx)
exnObject(cx)
{
}
ErrorReport::~ErrorReport()
{
}
-void
-ErrorReport::ReportAddonExceptionToTelemetry(JSContext* cx)
-{
- MOZ_ASSERT(exnObject);
- RootedObject unwrapped(cx, UncheckedUnwrap(exnObject));
- MOZ_ASSERT(unwrapped, "UncheckedUnwrap failed?");
-
- // There is not much we can report if the exception is not an ErrorObject, let's ignore those.
- if (!unwrapped->is<ErrorObject>())
- return;
-
- Rooted<ErrorObject*> errObj(cx, &unwrapped->as<ErrorObject>());
- RootedObject stack(cx, errObj->stack());
-
- // Let's ignore TOP level exceptions. For regular add-ons those will not be reported anyway,
- // for SDK based once it should not be a valid case either.
- // At this point the frame stack is unwound but the exception object stored the stack so let's
- // use that for getting the function name.
- if (!stack)
- return;
-
- JSCompartment* comp = stack->compartment();
- JSAddonId* addonId = comp->creationOptions().addonIdOrNull();
-
- // We only want to send the report if the scope that just have thrown belongs to an add-on.
- // Let's check the compartment of the youngest function on the stack, to determine that.
- if (!addonId)
- return;
-
- RootedString funnameString(cx);
- JS::SavedFrameResult result = GetSavedFrameFunctionDisplayName(cx, stack, &funnameString);
- // AccessDenied should never be the case here for add-ons but let's not risk it.
- JSAutoByteString bytes;
- const char* funname = nullptr;
- bool denied = result == JS::SavedFrameResult::AccessDenied;
- funname = denied ? "unknown"
- : funnameString ? AtomToPrintableString(cx,
- &funnameString->asAtom(),
- &bytes)
- : "anonymous";
-
- UniqueChars addonIdChars(JS_EncodeString(cx, addonId));
-
- const char* filename = nullptr;
- if (reportp && reportp->filename) {
- filename = strrchr(reportp->filename, '/');
- if (filename)
- filename++;
- }
- if (!filename) {
- filename = "FILE_NOT_FOUND";
- }
- char histogramKey[64];
- SprintfLiteral(histogramKey, "%s %s %s %u",
- addonIdChars.get(),
- funname,
- filename,
- (reportp ? reportp->lineno : 0) );
- cx->runtime()->addTelemetry(JS_TELEMETRY_ADDON_EXCEPTIONS, 1, histogramKey);
-}
-
bool
ErrorReport::init(JSContext* cx, HandleValue exn,
SniffingBehavior sniffingBehavior)
{
MOZ_ASSERT(!cx->isExceptionPending());
MOZ_ASSERT(!reportp);
if (exn.isObject()) {
@@ -852,20 +791,16 @@ ErrorReport::init(JSContext* cx, HandleV
exnObject = &exn.toObject();
reportp = ErrorFromException(cx, exnObject);
if (!reportp && sniffingBehavior == NoSideEffects) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
JSMSG_ERR_DURING_THROW);
return false;
}
-
- // Let's see if the exception is from add-on code, if so, it should be reported
- // to telemetry.
- ReportAddonExceptionToTelemetry(cx);
}
// Be careful not to invoke ToString if we've already successfully extracted
// an error report, since the exception might be wrapped in a security
// wrapper, and ToString-ing it might throw.
if (reportp) {
str = ErrorReportToString(cx, reportp);
--- a/js/src/jsfriendapi.h
+++ b/js/src/jsfriendapi.h
@@ -154,17 +154,16 @@ enum {
JS_TELEMETRY_GC_SCC_SWEEP_TOTAL_MS,
JS_TELEMETRY_GC_SCC_SWEEP_MAX_PAUSE_MS,
JS_TELEMETRY_GC_MINOR_REASON,
JS_TELEMETRY_GC_MINOR_REASON_LONG,
JS_TELEMETRY_GC_MINOR_US,
JS_TELEMETRY_GC_NURSERY_BYTES,
JS_TELEMETRY_GC_PRETENURE_COUNT,
JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_CONTENT,
- JS_TELEMETRY_ADDON_EXCEPTIONS,
JS_TELEMETRY_PRIVILEGED_PARSER_COMPILE_LAZY_AFTER_MS,
JS_TELEMETRY_WEB_PARSER_COMPILE_LAZY_AFTER_MS,
JS_TELEMETRY_END
};
typedef void
(*JSAccumulateTelemetryDataCallback)(int id, uint32_t sample, const char* key);
--- a/js/src/vm/JSCompartment.cpp
+++ b/js/src/vm/JSCompartment.cpp
@@ -1337,35 +1337,35 @@ JSCompartment::addSizeOfIncludingThis(mo
*scriptCountsMapArg += r.front().value()->sizeOfIncludingThis(mallocSizeOf);
}
}
}
void
JSCompartment::reportTelemetry()
{
- // Only report telemetry for web content, not add-ons or chrome JS.
- if (creationOptions_.addonIdOrNull() || isSystem_)
+ // Only report telemetry for web content, not chrome JS.
+ if (isSystem_)
return;
// Hazard analysis can't tell that the telemetry callbacks don't GC.
JS::AutoSuppressGCAnalysis nogc;
// Call back into Firefox's Telemetry reporter.
for (size_t i = 0; i < size_t(DeprecatedLanguageExtension::Count); i++) {
if (sawDeprecatedLanguageExtension[i])
runtime_->addTelemetry(JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_CONTENT, i);
}
}
void
JSCompartment::addTelemetry(const char* filename, DeprecatedLanguageExtension e)
{
- // Only report telemetry for web content, not add-ons or chrome JS.
- if (creationOptions_.addonIdOrNull() || isSystem_)
+ // Only report telemetry for web content, not chrome JS.
+ if (isSystem_)
return;
if (!filename || strncmp(filename, "http", 4) != 0)
return;
sawDeprecatedLanguageExtension[size_t(e)] = true;
}
HashNumber
--- a/js/src/vm/JSCompartment.h
+++ b/js/src/vm/JSCompartment.h
@@ -603,20 +603,17 @@ struct JSCompartment
bool isAtomsCompartment() const {
return isAtomsCompartment_;
}
void setIsAtomsCompartment() {
isAtomsCompartment_ = true;
}
// Used to approximate non-content code when reporting telemetry.
- inline bool isProbablySystemOrAddonCode() const {
- if (creationOptions_.addonIdOrNull())
- return true;
-
+ inline bool isProbablySystemCode() const {
return isSystem_;
}
private:
JSPrincipals* principals_;
bool isSystem_;
bool isAtomsCompartment_;
public:
--- a/js/src/vm/SelfHosting.cpp
+++ b/js/src/vm/SelfHosting.cpp
@@ -1877,17 +1877,17 @@ intrinsic_AddContentTelemetry(JSContext*
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 2);
int id = args[0].toInt32();
MOZ_ASSERT(id < JS_TELEMETRY_END);
MOZ_ASSERT(id >= 0);
- if (!cx->compartment()->isProbablySystemOrAddonCode())
+ if (!cx->compartment()->isProbablySystemCode())
cx->runtime()->addTelemetry(id, args[1].toInt32());
args.rval().setUndefined();
return true;
}
static bool
intrinsic_WarnDeprecatedStringMethod(JSContext* cx, unsigned argc, Value* vp)
--- a/js/src/vm/StringType.h
+++ b/js/src/vm/StringType.h
@@ -1633,21 +1633,16 @@ ValueToSource(JSContext* cx, HandleValue
* error, otherwise returns a new string reference. No Handle needed since the
* input is dead after the GC.
*/
extern JSString*
StringToSource(JSContext* cx, JSString* str);
} /* namespace js */
-// Addon IDs are interned atoms which are never destroyed. This detail is
-// not exposed outside the API.
-class JSAddonId : public JSAtom
-{};
-
MOZ_ALWAYS_INLINE bool
JSString::getChar(JSContext* cx, size_t index, char16_t* code)
{
MOZ_ASSERT(index < length());
/*
* Optimization for one level deep ropes.
* This is common for the following pattern:
--- a/js/xpconnect/src/XPCJSRuntime.cpp
+++ b/js/xpconnect/src/XPCJSRuntime.cpp
@@ -2562,19 +2562,16 @@ AccumulateTelemetryCallback(int id, uint
Telemetry::Accumulate(Telemetry::GC_NURSERY_BYTES, sample);
break;
case JS_TELEMETRY_GC_PRETENURE_COUNT:
Telemetry::Accumulate(Telemetry::GC_PRETENURE_COUNT, sample);
break;
case JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_CONTENT:
Telemetry::Accumulate(Telemetry::JS_DEPRECATED_LANGUAGE_EXTENSIONS_IN_CONTENT, sample);
break;
- case JS_TELEMETRY_ADDON_EXCEPTIONS:
- Telemetry::Accumulate(Telemetry::JS_TELEMETRY_ADDON_EXCEPTIONS, nsDependentCString(key), sample);
- break;
case JS_TELEMETRY_PRIVILEGED_PARSER_COMPILE_LAZY_AFTER_MS:
Telemetry::Accumulate(Telemetry::JS_PRIVILEGED_PARSER_COMPILE_LAZY_AFTER_MS, sample);
break;
case JS_TELEMETRY_WEB_PARSER_COMPILE_LAZY_AFTER_MS:
Telemetry::Accumulate(Telemetry::JS_WEB_PARSER_COMPILE_LAZY_AFTER_MS, sample);
break;
default:
MOZ_ASSERT_UNREACHABLE("Unexpected JS_TELEMETRY id");
--- a/js/xpconnect/src/nsXPConnect.cpp
+++ b/js/xpconnect/src/nsXPConnect.cpp
@@ -1177,25 +1177,16 @@ Btoa(JSContext* cx, unsigned argc, Value
}
bool
IsXrayWrapper(JSObject* obj)
{
return WrapperFactory::IsXrayWrapper(obj);
}
-JSAddonId*
-NewAddonId(JSContext* cx, const nsACString& id)
-{
- JS::RootedString str(cx, JS_NewStringCopyN(cx, id.BeginReading(), id.Length()));
- if (!str)
- return nullptr;
- return JS::NewAddonId(cx, str);
-}
-
} // namespace xpc
namespace mozilla {
namespace dom {
bool
IsChromeOrXBL(JSContext* cx, JSObject* /* unused */)
{
--- a/js/xpconnect/src/xpcprivate.h
+++ b/js/xpconnect/src/xpcprivate.h
@@ -2579,19 +2579,16 @@ xpc_GetJSPrivate(JSObject* obj)
inline JSContext*
xpc_GetSafeJSContext()
{
return XPCJSContext::Get()->Context();
}
namespace xpc {
-JSAddonId*
-NewAddonId(JSContext* cx, const nsACString& id);
-
// JSNatives to expose atob and btoa in various non-DOM XPConnect scopes.
bool
Atob(JSContext* cx, unsigned argc, JS::Value* vp);
bool
Btoa(JSContext* cx, unsigned argc, JS::Value* vp);
// Helper function that creates a JSFunction that wraps a native function that
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -7824,23 +7824,16 @@
"record_in_processes": ["main", "content"],
"alert_emails": ["seceng-telemetry@mozilla.com", "fxprivacyandsecurity@mozilla.com"],
"bug_numbers": [767676],
"expires_in_version": "never",
"kind": "enumerated",
"n_values": 100,
"description": "Security-related UI events (addons, form submission, TLS certs, Safe Browsing, updates and geolocation). See /security/manager/ssl/nsISecurityUITelemetry.idl for the specific values."
},
- "JS_TELEMETRY_ADDON_EXCEPTIONS" : {
- "record_in_processes": ["main", "content"],
- "expires_in_version" : "never",
- "kind": "count",
- "keyed" : true,
- "description" : "Exceptions thrown by add-ons"
- },
"IPC_TRANSACTION_CANCEL": {
"record_in_processes": ["main", "content"],
"alert_emails": ["billm@mozilla.com"],
"expires_in_version": "never",
"kind": "boolean",
"description": "True when an IPC transaction is canceled"
},
"IPC_SAME_PROCESS_MESSAGE_COPY_OOM_KB": {
--- a/toolkit/components/telemetry/histogram-whitelists.json
+++ b/toolkit/components/telemetry/histogram-whitelists.json
@@ -280,17 +280,16 @@
"HTTP_SUB_OPEN_TO_FIRST_RECEIVED",
"HTTP_SUB_OPEN_TO_FIRST_SENT",
"HTTP_SUB_REVALIDATION",
"HTTP_TRANSACTION_USE_ALTSVC",
"HTTP_TRANSACTION_USE_ALTSVC_OE",
"INNERWINDOWS_WITH_MUTATION_LISTENERS",
"IPC_SAME_PROCESS_MESSAGE_COPY_OOM_KB",
"IPV4_AND_IPV6_ADDRESS_CONNECTIVITY",
- "JS_TELEMETRY_ADDON_EXCEPTIONS",
"LOCALDOMSTORAGE_CLEAR_BLOCKING_MS",
"LOCALDOMSTORAGE_GETALLKEYS_BLOCKING_MS",
"LOCALDOMSTORAGE_GETKEY_BLOCKING_MS",
"LOCALDOMSTORAGE_GETLENGTH_BLOCKING_MS",
"LOCALDOMSTORAGE_GETVALUE_BLOCKING_MS",
"LOCALDOMSTORAGE_PRELOAD_PENDING_ON_FIRST_ACCESS",
"LOCALDOMSTORAGE_REMOVEKEY_BLOCKING_MS",
"LOCALDOMSTORAGE_SESSIONONLY_PRELOAD_BLOCKING_MS",
@@ -924,17 +923,16 @@
"IMAGE_DECODE_SPEED_JPEG",
"IMAGE_DECODE_SPEED_PNG",
"IMAGE_DECODE_TIME",
"INNERWINDOWS_WITH_MUTATION_LISTENERS",
"IPC_SAME_PROCESS_MESSAGE_COPY_OOM_KB",
"IPC_TRANSACTION_CANCEL",
"IPV4_AND_IPV6_ADDRESS_CONNECTIVITY",
"JS_DEPRECATED_LANGUAGE_EXTENSIONS_IN_CONTENT",
- "JS_TELEMETRY_ADDON_EXCEPTIONS",
"LOCALDOMSTORAGE_CLEAR_BLOCKING_MS",
"LOCALDOMSTORAGE_GETALLKEYS_BLOCKING_MS",
"LOCALDOMSTORAGE_GETKEY_BLOCKING_MS",
"LOCALDOMSTORAGE_GETLENGTH_BLOCKING_MS",
"LOCALDOMSTORAGE_GETVALUE_BLOCKING_MS",
"LOCALDOMSTORAGE_PRELOAD_PENDING_ON_FIRST_ACCESS",
"LOCALDOMSTORAGE_REMOVEKEY_BLOCKING_MS",
"LOCALDOMSTORAGE_SESSIONONLY_PRELOAD_BLOCKING_MS",
@@ -1692,17 +1690,16 @@
"FXA_CONFIGURED",
"FX_BROWSER_FULLSCREEN_USED",
"FX_CONTENT_CRASH_DUMP_UNAVAILABLE",
"FX_CONTENT_CRASH_NOT_SUBMITTED",
"FX_CONTENT_CRASH_PRESENTED",
"FX_SESSION_RESTORE_SEND_UPDATE_CAUSED_OOM",
"FX_TOUCH_USED",
"GEOLOCATION_ERROR",
- "JS_TELEMETRY_ADDON_EXCEPTIONS",
"MASTER_PASSWORD_ENABLED",
"MEDIA_CODEC_USED",
"NETWORK_CONNECTION_COUNT",
"NUMBER_OF_PROFILES",
"ONBEFOREUNLOAD_PROMPT_COUNT",
"OPENGL_COMPOSITING_FAILURE_ID",
"PERMISSIONS_SQL_CORRUPTED",
"PLUGIN_HANG_NOTICE_COUNT",