| Index: base/trace_event/heap_profiler_type_name_deduplicator.cc
|
| diff --git a/base/trace_event/heap_profiler_type_name_deduplicator.cc b/base/trace_event/heap_profiler_type_name_deduplicator.cc
|
| index e7f57c8ae0ebd853404eb3bfd2da792d8547b05a..d88a5e671ff4318ed6b695e2d7d4900287118315 100644
|
| --- a/base/trace_event/heap_profiler_type_name_deduplicator.cc
|
| +++ b/base/trace_event/heap_profiler_type_name_deduplicator.cc
|
| @@ -9,6 +9,7 @@
|
| #include <string>
|
| #include <utility>
|
|
|
| +#include "base/files/file_path.h"
|
| #include "base/json/string_escape.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "base/trace_event/trace_event_memory_overhead.h"
|
| @@ -16,6 +17,32 @@
|
| namespace base {
|
| namespace trace_event {
|
|
|
| +namespace {
|
| +
|
| +// Extract directory name from task context if |type_name| was task context.
|
| +StringPiece ExtractDirNameFromTaskContext(const char* type_name) {
|
| + StringPiece result = type_name;
|
| + size_t last_seperator = result.find_last_of(FilePath::kSeparators);
|
| +
|
| + // If |type_name| is a not a file path, the seperator will not be found, so
|
| + // the whole type name is returned.
|
| + if (last_seperator == StringPiece::npos)
|
| + return result;
|
| +
|
| + // Remove the file name from the path.
|
| + result.remove_suffix(result.length() - last_seperator);
|
| +
|
| + // Remove the parent directory references - '..'.
|
| + while (result.starts_with(FilePath::kParentDirectory)) {
|
| + size_t parent_seperator = result.find_first_of(FilePath::kSeparators);
|
| + DCHECK_NE(StringPiece::npos, parent_seperator);
|
| + result.remove_prefix(parent_seperator + 1);
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| TypeNameDeduplicator::TypeNameDeduplicator() {
|
| // A null pointer has type ID 0 ("unknown type");
|
| type_ids_.insert(std::make_pair(nullptr, 0));
|
| @@ -53,9 +80,12 @@ void TypeNameDeduplicator::AppendAsTraceFormat(std::string* out) const {
|
| // a dictionary.
|
| SStringPrintf(&buffer, ",\"%d\":", it->second);
|
|
|
| + // TODO(ssid): crbug.com/594803 the type name is misused for category name.
|
| + StringPiece type_info = ExtractDirNameFromTaskContext(it->first);
|
| +
|
| // |EscapeJSONString| appends, it does not overwrite |buffer|.
|
| bool put_in_quotes = true;
|
| - EscapeJSONString(it->first, put_in_quotes, &buffer);
|
| + EscapeJSONString(type_info, put_in_quotes, &buffer);
|
| out->append(buffer);
|
| }
|
|
|
|
|