// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_TRACE_EVENT_TRACED_VALUE_H_ #define BASE_TRACE_EVENT_TRACED_VALUE_H_ #include #include #include #include #include "base/macros.h" #include "base/pickle.h" #include "base/strings/string_piece.h" #include "base/trace_event/trace_event_impl.h" namespace base { class Value; namespace trace_event { class BASE_EXPORT TracedValue : public ConvertableToTraceFormat { public: // TODO(oysteine): |capacity| is not used in any production code. Consider // removing it. explicit TracedValue(size_t capacity = 0); ~TracedValue() override; void EndDictionary(); void EndArray(); // These methods assume that |name| is a long lived "quoted" string. void SetInteger(const char* name, int value); void SetDouble(const char* name, double value); void SetBoolean(const char* name, bool value); void SetString(const char* name, base::StringPiece value); void SetValue(const char* name, TracedValue* value); void BeginDictionary(const char* name); void BeginArray(const char* name); // These, instead, can be safely passed a temporary string. void SetIntegerWithCopiedName(base::StringPiece name, int value); void SetDoubleWithCopiedName(base::StringPiece name, double value); void SetBooleanWithCopiedName(base::StringPiece name, bool value); void SetStringWithCopiedName(base::StringPiece name, base::StringPiece value); void SetValueWithCopiedName(base::StringPiece name, TracedValue* value); void BeginDictionaryWithCopiedName(base::StringPiece name); void BeginArrayWithCopiedName(base::StringPiece name); void AppendInteger(int); void AppendDouble(double); void AppendBoolean(bool); void AppendString(base::StringPiece); void BeginArray(); void BeginDictionary(); // ConvertableToTraceFormat implementation. void AppendAsTraceFormat(std::string* out) const override; bool AppendToProto(ProtoAppender* appender) override; void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead) override; // A custom serialization class can be supplied by implementing the // Writer interface and supplying a factory class to SetWriterFactoryCallback. // Primarily used by Perfetto to write TracedValues directly into its proto // format, which lets us do a direct memcpy() in AppendToProto() rather than // a JSON serialization step in AppendAsTraceFormat. class BASE_EXPORT Writer { public: virtual ~Writer() = default; virtual void BeginArray() = 0; virtual void BeginDictionary() = 0; virtual void EndDictionary() = 0; virtual void EndArray() = 0; // These methods assume that |name| is a long lived "quoted" string. virtual void SetInteger(const char* name, int value) = 0; virtual void SetDouble(const char* name, double value) = 0; virtual void SetBoolean(const char* name, bool value) = 0; virtual void SetString(const char* name, base::StringPiece value) = 0; virtual void SetValue(const char* name, Writer* value) = 0; virtual void BeginDictionary(const char* name) = 0; virtual void BeginArray(const char* name) = 0; // These, instead, can be safely passed a temporary string. virtual void SetIntegerWithCopiedName(base::StringPiece name, int value) = 0; virtual void SetDoubleWithCopiedName(base::StringPiece name, double value) = 0; virtual void SetBooleanWithCopiedName(base::StringPiece name, bool value) = 0; virtual void SetStringWithCopiedName(base::StringPiece name, base::StringPiece value) = 0; virtual void SetValueWithCopiedName(base::StringPiece name, Writer* value) = 0; virtual void BeginDictionaryWithCopiedName(base::StringPiece name) = 0; virtual void BeginArrayWithCopiedName(base::StringPiece name) = 0; virtual void AppendInteger(int) = 0; virtual void AppendDouble(double) = 0; virtual void AppendBoolean(bool) = 0; virtual void AppendString(base::StringPiece) = 0; virtual void AppendAsTraceFormat(std::string* out) const = 0; virtual bool AppendToProto(ProtoAppender* appender); virtual void EstimateTraceMemoryOverhead( TraceEventMemoryOverhead* overhead) = 0; virtual bool IsPickleWriter() const = 0; virtual bool IsProtoWriter() const = 0; }; typedef std::unique_ptr (*WriterFactoryCallback)(size_t capacity); static void SetWriterFactoryCallback(WriterFactoryCallback callback); protected: TracedValue(size_t capacity, bool forced_json); std::unique_ptr ToBaseValue() const; private: std::unique_ptr writer_; #ifndef NDEBUG // In debug builds checks the pairings of {Start,End}{Dictionary,Array} std::vector nesting_stack_; #endif DISALLOW_COPY_AND_ASSIGN(TracedValue); }; // TracedValue that is convertable to JSON format. This has lower performance // than the default TracedValue in production code, and should be used only for // testing and debugging. Should be avoided in tracing. It's for // testing/debugging code calling value dumping function designed for tracing, // like the following: // // TracedValueJSON value; // AsValueInto(&value); // which is designed for tracing. // return value.ToJSON(); // // If the code is merely for testing/debugging, base::Value should be used // instead. class BASE_EXPORT TracedValueJSON : public TracedValue { public: explicit TracedValueJSON(size_t capacity = 0) : TracedValue(capacity, /*forced_josn*/ true) {} using TracedValue::ToBaseValue; // Converts the value into a JSON string without formatting. Suitable for // printing a simple value or printing a value in a single line context. std::string ToJSON() const; // Converts the value into a formatted JSON string, with indentation, spaces // and new lines for better human readability of complex values. std::string ToFormattedJSON() const; }; } // namespace trace_event } // namespace base #endif // BASE_TRACE_EVENT_TRACED_VALUE_H_