/* -*- 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/. */ #ifndef GeckoTelemetryDelegate_h__ #define GeckoTelemetryDelegate_h__ #include "geckoview/streaming/GeckoViewStreamingTelemetry.h" #include #include "mozilla/java/RuntimeTelemetryNatives.h" #include "mozilla/jni/Natives.h" namespace mozilla { namespace widget { class GeckoTelemetryDelegate final : public GeckoViewStreamingTelemetry::StreamingTelemetryDelegate, public mozilla::java::RuntimeTelemetry::Proxy::Natives< GeckoTelemetryDelegate> { public: // Implement Proxy native. static void RegisterDelegateProxy( mozilla::java::RuntimeTelemetry::Proxy::Param aProxy) { MOZ_ASSERT(aProxy); GeckoViewStreamingTelemetry::RegisterDelegate( new GeckoTelemetryDelegate(aProxy)); } explicit GeckoTelemetryDelegate( mozilla::java::RuntimeTelemetry::Proxy::Param aProxy) : mProxy(aProxy) {} private: void DispatchHistogram(bool aIsCategorical, const nsCString& aName, const nsTArray& aSamples) { if (!mozilla::jni::IsAvailable() || !mProxy || aSamples.Length() < 1) { return; } // Convert aSamples to an array of int64_t. We know |samples| required // capacity needs to match |aSamples.Length()|. nsTArray samples(aSamples.Length()); for (size_t i = 0, l = aSamples.Length(); i < l; ++i) { samples.AppendElement(static_cast(aSamples[i])); } // LongArray::From *copies* the elements mProxy->DispatchHistogram(aIsCategorical, aName, mozilla::jni::LongArray::From(samples)); } // Implement StreamingTelemetryDelegate. void ReceiveHistogramSamples(const nsCString& aName, const nsTArray& aSamples) override { DispatchHistogram(/* isCategorical */ false, aName, aSamples); } void ReceiveCategoricalHistogramSamples( const nsCString& aName, const nsTArray& aSamples) override { DispatchHistogram(/* isCategorical */ true, aName, aSamples); } void ReceiveBoolScalarValue(const nsCString& aName, bool aValue) override { if (!mozilla::jni::IsAvailable() || !mProxy) { return; } mProxy->DispatchBooleanScalar(aName, aValue); } void ReceiveStringScalarValue(const nsCString& aName, const nsCString& aValue) override { if (!mozilla::jni::IsAvailable() || !mProxy) { return; } mProxy->DispatchStringScalar(aName, aValue); } void ReceiveUintScalarValue(const nsCString& aName, uint32_t aValue) override { if (!mozilla::jni::IsAvailable() || !mProxy) { return; } mProxy->DispatchLongScalar(aName, static_cast(aValue)); } mozilla::java::RuntimeTelemetry::Proxy::GlobalRef mProxy; }; } // namespace widget } // namespace mozilla #endif // GeckoTelemetryDelegate_h__