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); }
NS_IMETHODIMP TelemetryImpl::HistogramFrom(const nsACString &name, const nsACString &existing_name, JSContext *cx, jsval *ret) { Histogram *existing; nsresult rv = GetHistogramByName(existing_name, &existing); if (NS_FAILED(rv)) return rv; uint32_t histogramType; bool success = TelemetryHistogramType(existing, &histogramType); if (!success) return NS_ERROR_INVALID_ARG; Histogram *clone; rv = HistogramGet(PromiseFlatCString(name).get(), existing->declared_min(), existing->declared_max(), existing->bucket_count(), histogramType, &clone); if (NS_FAILED(rv)) return rv; Histogram::SampleSet ss; existing->SnapshotSample(&ss); clone->AddSampleSet(ss); return WrapAndReturnHistogram(clone, cx, ret); }
NS_IMETHODIMP TelemetryImpl::GetHistogramById(const nsACString &name, JSContext *cx, jsval *ret) { // Cache names // Note the histogram names are statically allocated if (!mHistogramMap.Count()) { for (PRUint32 i = 0; i < Telemetry::HistogramCount; i++) { CharPtrEntryType *entry = mHistogramMap.PutEntry(gHistograms[i].id); if (NS_UNLIKELY(!entry)) { mHistogramMap.Clear(); return NS_ERROR_OUT_OF_MEMORY; } entry->mData = (Telemetry::ID) i; } } CharPtrEntryType *entry = mHistogramMap.GetEntry(PromiseFlatCString(name).get()); if (!entry) return NS_ERROR_FAILURE; Histogram *h; nsresult rv = GetHistogramByEnumId(entry->mData, &h); if (NS_FAILED(rv)) return rv; return WrapAndReturnHistogram(h, cx, ret); }
NS_IMETHODIMP TelemetryImpl::NewHistogram(const nsACString &name, uint32_t min, uint32_t max, uint32_t bucketCount, uint32_t histogramType, JSContext *cx, jsval *ret) { Histogram *h; nsresult rv = HistogramGet(PromiseFlatCString(name).get(), min, max, bucketCount, histogramType, &h); if (NS_FAILED(rv)) return rv; h->ClearFlags(Histogram::kUmaTargetedHistogramFlag); return WrapAndReturnHistogram(h, cx, ret); }
NS_IMETHODIMP TelemetryImpl::GetHistogramById(const nsACString &name, JSContext *cx, jsval *ret) { Histogram *h; nsresult rv = GetHistogramByName(name, &h); if (NS_FAILED(rv)) return rv; return WrapAndReturnHistogram(h, cx, ret); }
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); }