NS_IMETHODIMP TelemetryImpl::GetAddonHistogram(const nsACString &id, const nsACString &name, JSContext *cx, jsval *ret) { AddonEntryType *addonEntry = mAddonMap.GetEntry(id); // The given id has not been registered. if (!addonEntry) { return NS_ERROR_INVALID_ARG; } AddonHistogramMapType *histogramMap = addonEntry->mData; AddonHistogramEntryType *histogramEntry = histogramMap->GetEntry(name); // The given histogram name has not been registered. if (!histogramEntry) { return NS_ERROR_INVALID_ARG; } AddonHistogramInfo &info = histogramEntry->mData; if (!info.h) { nsCAutoString actualName; AddonHistogramName(id, name, actualName); if (!CreateHistogramForAddon(actualName, info)) { return NS_ERROR_FAILURE; } } return WrapAndReturnHistogram(info.h, cx, ret); }
bool TelemetryImpl::AddonReflector(AddonEntryType *entry, JSContext *cx, JSObject *obj) { const nsACString &addonId = entry->GetKey(); JSObject *subobj = JS_NewObject(cx, NULL, NULL, NULL); if (!subobj) { return false; } JS::AutoObjectRooter r(cx, subobj); AddonHistogramMapType *map = entry->mData; if (!(map->ReflectIntoJS(AddonHistogramReflector, cx, subobj) && JS_DefineProperty(cx, obj, PromiseFlatCString(addonId).get(), OBJECT_TO_JSVAL(subobj), NULL, NULL, JSPROP_ENUMERATE))) { return false; } return true; }
NS_IMETHODIMP TelemetryImpl::GetAddonHistogram(const nsACString &id, const nsACString &name, JSContext *cx, jsval *ret) { AddonEntryType *addonEntry = mAddonMap.GetEntry(id); // The given id has not been registered. if (!addonEntry) { return NS_ERROR_INVALID_ARG; } AddonHistogramMapType *histogramMap = addonEntry->mData; AddonHistogramEntryType *histogramEntry = histogramMap->GetEntry(name); // The given histogram name has not been registered. if (!histogramEntry) { return NS_ERROR_INVALID_ARG; } AddonHistogramInfo &info = histogramEntry->mData; Histogram *h; if (info.h) { h = info.h; } else { nsCAutoString actualName; AddonHistogramName(id, name, actualName); nsresult rv = HistogramGet(PromiseFlatCString(actualName).get(), info.min, info.max, info.bucketCount, info.histogramType, &h); if (NS_FAILED(rv)) { return rv; } // Don't let this histogram be reported via the normal means // (e.g. Telemetry.registeredHistograms); we'll make it available in // other ways. h->ClearFlags(Histogram::kUmaTargetedHistogramFlag); info.h = h; } return WrapAndReturnHistogram(h, cx, ret); }
NS_IMETHODIMP TelemetryImpl::RegisterAddonHistogram(const nsACString &id, const nsACString &name, uint32_t min, uint32_t max, uint32_t bucketCount, uint32_t histogramType) { AddonEntryType *addonEntry = mAddonMap.GetEntry(id); if (!addonEntry) { addonEntry = mAddonMap.PutEntry(id); if (NS_UNLIKELY(!addonEntry)) { return NS_ERROR_OUT_OF_MEMORY; } addonEntry->mData = new AddonHistogramMapType(); } AddonHistogramMapType *histogramMap = addonEntry->mData; AddonHistogramEntryType *histogramEntry = histogramMap->GetEntry(name); // Can't re-register the same histogram. if (histogramEntry) { return NS_ERROR_FAILURE; } histogramEntry = histogramMap->PutEntry(name); if (NS_UNLIKELY(!histogramEntry)) { return NS_ERROR_OUT_OF_MEMORY; } AddonHistogramInfo &info = histogramEntry->mData; info.min = min; info.max = max; info.bucketCount = bucketCount; info.histogramType = histogramType; return NS_OK; }