| Index: net/traffic_annotation/network_traffic_annotation.h
|
| diff --git a/net/traffic_annotation/network_traffic_annotation.h b/net/traffic_annotation/network_traffic_annotation.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f4314f0ec3c2fb4a320ec29f19122de308067bef
|
| --- /dev/null
|
| +++ b/net/traffic_annotation/network_traffic_annotation.h
|
| @@ -0,0 +1,75 @@
|
| +// Copyright (c) 2016 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 NET_TRAFFIC_ANNOTATION_NETWORK_TRAFFIC_ANNOTATION_H_
|
| +#define NET_TRAFFIC_ANNOTATION_NETWORK_TRAFFIC_ANNOTATION_H_
|
| +
|
| +namespace {
|
| +
|
| +// Recuresively compute hash code of the given string as a constant expression.
|
| +template <int N>
|
| +static constexpr unsigned int recursive_hash(const char* str) {
|
| + return (unsigned int)(recursive_hash<N - 1>(str) * 31 + str[N]) % 138003713;
|
| +}
|
| +
|
| +// Recursion stopper for the above function.
|
| +template <>
|
| +constexpr unsigned int recursive_hash<-1>(const char* str) {
|
| + return 7;
|
| +}
|
| +
|
| +// Entry point to function that computes hash as constant expression.
|
| +#define COMPUTE_STRING_HASH(S) recursive_hash<sizeof(S)>(S)
|
| +
|
| +} // namespace
|
| +
|
| +namespace net {
|
| +
|
| +// Defined type for network traffic annotation tags.
|
| +typedef const unsigned int NetworkTrafficAnnotationTag;
|
| +
|
| +// Function to convert a network traffic annotation's unique id and protobuf
|
| +// text into a NetworkTrafficAnnotationTag.
|
| +//
|
| +// This function serves as a tag that can be discovered and extracted via
|
| +// clang tools. This allows reviewing all network traffic that is generated
|
| +// and annotated by Chrome.
|
| +//
|
| +// |unique_id| should be a string that uniquely identifies this annotation
|
| +// across all of Chromium source code.
|
| +// |proto| is a text-encoded NetworkTrafficAnnotation protobuf (see
|
| +// tools/traffic_annotaiton/traffic_annotation.proto)
|
| +//
|
| +// This function should be called with inlined parameters like
|
| +// NetworkTrafficAnnotationTag tag = DefineNetworkTrafficAnnotation(
|
| +// "unique_tag_id",
|
| +// R"(semantics: {...}
|
| +// policy: {...}
|
| +// )");
|
| +// This allows the compiler to calculate and extract the hashed |unique_id|
|
| +// at compile time without copying the entire protobuf into the text segment
|
| +// of the binary or creating any runtime performance impact.
|
| +//
|
| +// Please do NOT use the following syntax:
|
| +// const char* proto = R("...");
|
| +// NetworkTrafficAnnotationTag tag = DefineNetworkTrafficAnnotation(
|
| +// "unique_tag_id", proto);
|
| +constexpr NetworkTrafficAnnotationTag DefineNetworkTrafficAnnotation(
|
| + const char* unique_id,
|
| + const char* proto) {
|
| + return (NetworkTrafficAnnotationTag)COMPUTE_STRING_HASH(unique_id);
|
| +}
|
| +
|
| +// Placeholder for unannotated usages.
|
| +#define NO_TRAFFIC_ANNOTATION_YET \
|
| + net::DefineNetworkTrafficAnnotation("Undefined", "Nothing here yet.")
|
| +
|
| +// Macro for unit tests traffic annotations.
|
| +#define TRAFFIC_ANNOTATION_FOR_TESTS \
|
| + net::DefineNetworkTrafficAnnotation( \
|
| + "UnitTest", "Traffic annotation for unit, browser and other tests")
|
| +
|
| +} // namespace net
|
| +
|
| +#endif // NET_TRAFFIC_ANNOTATION_NETWORK_TRAFFIC_ANNOTATION_H_
|
|
|