Files
tubestation/toolkit/components/glean/bindings/GleanPings.cpp
Jan-Erik Rediger 4ef31254d6 Bug 1903578 - Use the correct type alias when iterating to avoid truncation r=chutten
`ping_entry_t` is a `uint32_t`.
It worked by accident so far, because by sheer luck the index was on the
lower bits already.
It won't be anymore when more pings are added and then breaks as we
start reading from the middle of the lookup array.

No new test, but `test_JOG.js` breaks in `test_enumerable_names` once a
new ping is added.

Differential Revision: https://phabricator.services.mozilla.com/D214271
2024-06-19 14:25:41 +00:00

93 lines
2.9 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/glean/bindings/GleanPings.h"
#include "mozilla/dom/BindingUtils.h"
#include "mozilla/dom/DOMJSClass.h"
#include "mozilla/dom/GleanPingsBinding.h"
#include "mozilla/glean/bindings/GleanJSPingsLookup.h"
#include "mozilla/glean/bindings/jog/JOG.h"
#include "mozilla/glean/bindings/Ping.h"
#include "MainThreadUtils.h"
#include "js/PropertyAndElement.h" // JS_DefineProperty
namespace mozilla::glean {
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(GleanPings)
NS_IMPL_CYCLE_COLLECTING_ADDREF(GleanPings)
NS_IMPL_CYCLE_COLLECTING_RELEASE(GleanPings)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(GleanPings)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
JSObject* GleanPings::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) {
return dom::GleanPingsImpl_Binding::Wrap(aCx, this, aGivenProto);
}
// static
bool GleanPings::DefineGleanPings(JSContext* aCx,
JS::Handle<JSObject*> aGlobal) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(JS::GetClass(aGlobal)->flags & JSCLASS_DOM_GLOBAL,
"Passed object is not a global object!");
nsIGlobalObject* global = xpc::CurrentNativeGlobal(aCx);
if (NS_WARN_IF(!global)) {
return false;
}
JS::Rooted<JS::Value> gleanPings(aCx);
js::AssertSameCompartment(aCx, aGlobal);
auto impl = MakeRefPtr<GleanPings>();
if (!dom::GetOrCreateDOMReflector(aCx, impl.get(), &gleanPings)) {
return false;
}
return JS_DefineProperty(aCx, aGlobal, "GleanPings", gleanPings,
JSPROP_ENUMERATE);
}
already_AddRefed<GleanPing> GleanPings::NamedGetter(const nsAString& aName,
bool& aFound) {
aFound = false;
NS_ConvertUTF16toUTF8 pingName(aName);
JOG::EnsureRuntimeMetricsRegistered();
Maybe<uint32_t> pingId = JOG::GetPing(pingName);
if (pingId.isNothing() && !JOG::AreRuntimeMetricsComprehensive()) {
pingId = PingByNameLookup(pingName);
}
if (pingId.isNothing()) {
aFound = false;
return nullptr;
}
aFound = true;
return MakeAndAddRef<GleanPing>(pingId.value());
}
bool GleanPings::NameIsEnumerable(const nsAString& aName) { return false; }
void GleanPings::GetSupportedNames(nsTArray<nsString>& aNames) {
JOG::GetPingNames(aNames);
if (!JOG::AreRuntimeMetricsComprehensive()) {
for (ping_entry_t entry : sPingByNameLookupEntries) {
const char* pingName = GetPingName(entry);
aNames.AppendElement()->AssignASCII(pingName);
}
}
}
} // namespace mozilla::glean