OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef NET_LOG_NET_LOG_H_ | 5 #ifndef NET_LOG_NET_LOG_H_ |
6 #define NET_LOG_NET_LOG_H_ | 6 #define NET_LOG_NET_LOG_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
11 #include <string> | 11 #include <string> |
12 | 12 |
13 #include "base/atomicops.h" | 13 #include "base/atomicops.h" |
14 #include "base/callback_forward.h" | 14 #include "base/callback_forward.h" |
15 #include "base/compiler_specific.h" | 15 #include "base/compiler_specific.h" |
16 #include "base/macros.h" | 16 #include "base/macros.h" |
17 #include "base/observer_list.h" | 17 #include "base/observer_list.h" |
18 #include "base/strings/string16.h" | 18 #include "base/strings/string16.h" |
19 #include "base/synchronization/lock.h" | 19 #include "base/synchronization/lock.h" |
20 #include "base/time/time.h" | 20 #include "base/time/time.h" |
21 #include "build/build_config.h" | 21 #include "build/build_config.h" |
22 #include "net/base/net_export.h" | 22 #include "net/base/net_export.h" |
23 #include "net/log/net_log_capture_mode.h" | 23 #include "net/log/net_log_capture_mode.h" |
| 24 #include "net/log/net_log_event_type.h" |
| 25 #include "net/log/net_log_source_type.h" |
24 | 26 |
25 namespace base { | 27 namespace base { |
26 class DictionaryValue; | 28 class DictionaryValue; |
27 class Value; | 29 class Value; |
28 } | 30 } |
29 | 31 |
30 namespace net { | 32 namespace net { |
31 | 33 |
32 // NetLog is the destination for log messages generated by the network stack. | 34 // NetLog is the destination for log messages generated by the network stack. |
33 // Each log message has a "source" field which identifies the specific entity | 35 // Each log message has a "source" field which identifies the specific entity |
34 // that generated the message (for example, which URLRequest or which | 36 // that generated the message (for example, which URLRequest or which |
35 // SpdySession). | 37 // SpdySession). |
36 // | 38 // |
37 // To avoid needing to pass in the "source ID" to the logging functions, NetLog | 39 // To avoid needing to pass in the "source ID" to the logging functions, NetLog |
38 // is usually accessed through a BoundNetLog, which will always pass in a | 40 // is usually accessed through a BoundNetLog, which will always pass in a |
39 // specific source ID. | 41 // specific source ID. |
40 // | 42 // |
41 // All methods are thread safe, with the exception that no NetLog or | 43 // All methods are thread safe, with the exception that no NetLog or |
42 // NetLog::ThreadSafeObserver functions may be called by an observer's | 44 // NetLog::ThreadSafeObserver functions may be called by an observer's |
43 // OnAddEntry() method. Doing so will result in a deadlock. | 45 // OnAddEntry() method. Doing so will result in a deadlock. |
44 // | 46 // |
45 // For a broader introduction see the design document: | 47 // For a broader introduction see the design document: |
46 // https://sites.google.com/a/chromium.org/dev/developers/design-documents/netwo
rk-stack/netlog | 48 // https://sites.google.com/a/chromium.org/dev/developers/design-documents/netwo
rk-stack/netlog |
47 class NET_EXPORT NetLog { | 49 class NET_EXPORT NetLog { |
48 public: | 50 public: |
49 enum EventType { | |
50 #define EVENT_TYPE(label) TYPE_##label, | |
51 #include "net/log/net_log_event_type_list.h" | |
52 #undef EVENT_TYPE | |
53 EVENT_COUNT | |
54 }; | |
55 | |
56 // The 'phase' of an event trace (whether it marks the beginning or end | |
57 // of an event.). | |
58 enum EventPhase { | |
59 PHASE_NONE, | |
60 PHASE_BEGIN, | |
61 PHASE_END, | |
62 }; | |
63 | |
64 // The "source" identifies the entity that generated the log message. | |
65 enum SourceType { | |
66 #define SOURCE_TYPE(label) SOURCE_##label, | |
67 #include "net/log/net_log_source_type_list.h" | |
68 #undef SOURCE_TYPE | |
69 SOURCE_COUNT | |
70 }; | |
71 | 51 |
72 // A callback that returns a Value representation of the parameters | 52 // A callback that returns a Value representation of the parameters |
73 // associated with an event. If called, it will be called synchronously, | 53 // associated with an event. If called, it will be called synchronously, |
74 // so it need not have owning references. May be called more than once, or | 54 // so it need not have owning references. May be called more than once, or |
75 // not at all. May return NULL. | 55 // not at all. May return NULL. |
76 typedef base::Callback<std::unique_ptr<base::Value>(NetLogCaptureMode)> | 56 typedef base::Callback<std::unique_ptr<base::Value>(NetLogCaptureMode)> |
77 ParametersCallback; | 57 ParametersCallback; |
78 | 58 |
79 // Identifies the entity that generated this log. The |id| field should | 59 // Identifies the entity that generated this log. The |id| field should |
80 // uniquely identify the source, and is used by log observers to infer | 60 // uniquely identify the source, and is used by log observers to infer |
81 // message groupings. Can use NetLog::NextID() to create unique IDs. | 61 // message groupings. Can use NetLog::NextID() to create unique IDs. |
82 struct NET_EXPORT Source { | 62 struct NET_EXPORT Source { |
83 static const uint32_t kInvalidId; | 63 static const uint32_t kInvalidId; |
84 | 64 |
85 Source(); | 65 Source(); |
86 Source(SourceType type, uint32_t id); | 66 Source(NetLogSourceType type, uint32_t id); |
87 bool IsValid() const; | 67 bool IsValid() const; |
88 | 68 |
89 // Adds the source to a DictionaryValue containing event parameters, | 69 // Adds the source to a DictionaryValue containing event parameters, |
90 // using the name "source_dependency". | 70 // using the name "source_dependency". |
91 void AddToEventParameters(base::DictionaryValue* event_params) const; | 71 void AddToEventParameters(base::DictionaryValue* event_params) const; |
92 | 72 |
93 // Returns a callback that returns a dictionary with a single entry | 73 // Returns a callback that returns a dictionary with a single entry |
94 // named "source_dependency" that describes |this|. | 74 // named "source_dependency" that describes |this|. |
95 ParametersCallback ToEventParametersCallback() const; | 75 ParametersCallback ToEventParametersCallback() const; |
96 | 76 |
97 // Attempts to extract a Source from a set of event parameters. Returns | 77 // Attempts to extract a Source from a set of event parameters. Returns |
98 // true and writes the result to |source| on success. Returns false and | 78 // true and writes the result to |source| on success. Returns false and |
99 // makes |source| an invalid source on failure. | 79 // makes |source| an invalid source on failure. |
100 // TODO(mmenke): Long term, we want to remove this. | 80 // TODO(mmenke): Long term, we want to remove this. |
101 static bool FromEventParameters(base::Value* event_params, Source* source); | 81 static bool FromEventParameters(base::Value* event_params, Source* source); |
102 | 82 |
103 SourceType type; | 83 NetLogSourceType type; |
104 uint32_t id; | 84 uint32_t id; |
105 }; | 85 }; |
106 | 86 |
107 struct NET_EXPORT EntryData { | 87 struct NET_EXPORT EntryData { |
108 EntryData(EventType type, | 88 EntryData(NetLogEventType type, |
109 Source source, | 89 Source source, |
110 EventPhase phase, | 90 NetLogEventPhase phase, |
111 base::TimeTicks time, | 91 base::TimeTicks time, |
112 const ParametersCallback* parameters_callback); | 92 const ParametersCallback* parameters_callback); |
113 ~EntryData(); | 93 ~EntryData(); |
114 | 94 |
115 const EventType type; | 95 const NetLogEventType type; |
116 const Source source; | 96 const Source source; |
117 const EventPhase phase; | 97 const NetLogEventPhase phase; |
118 const base::TimeTicks time; | 98 const base::TimeTicks time; |
119 const ParametersCallback* const parameters_callback; | 99 const ParametersCallback* const parameters_callback; |
120 }; | 100 }; |
121 | 101 |
122 // An Entry pre-binds EntryData to a capture mode, so observers will observe | 102 // An Entry pre-binds EntryData to a capture mode, so observers will observe |
123 // the output of ToValue() and ParametersToValue() at their log capture mode | 103 // the output of ToValue() and ParametersToValue() at their log capture mode |
124 // rather than the current maximum. | 104 // rather than the current maximum. |
125 class NET_EXPORT Entry { | 105 class NET_EXPORT Entry { |
126 public: | 106 public: |
127 Entry(const EntryData* data, NetLogCaptureMode capture_mode); | 107 Entry(const EntryData* data, NetLogCaptureMode capture_mode); |
128 ~Entry(); | 108 ~Entry(); |
129 | 109 |
130 EventType type() const { return data_->type; } | 110 NetLogEventType type() const { return data_->type; } |
131 Source source() const { return data_->source; } | 111 Source source() const { return data_->source; } |
132 EventPhase phase() const { return data_->phase; } | 112 NetLogEventPhase phase() const { return data_->phase; } |
133 | 113 |
134 // Serializes the specified event to a Value. The Value also includes the | 114 // Serializes the specified event to a Value. The Value also includes the |
135 // current time. Takes in a time to allow back-dating entries. | 115 // current time. Takes in a time to allow back-dating entries. |
136 std::unique_ptr<base::Value> ToValue() const; | 116 std::unique_ptr<base::Value> ToValue() const; |
137 | 117 |
138 // Returns the parameters as a Value. Returns NULL if there are no | 118 // Returns the parameters as a Value. Returns NULL if there are no |
139 // parameters. | 119 // parameters. |
140 std::unique_ptr<base::Value> ParametersToValue() const; | 120 std::unique_ptr<base::Value> ParametersToValue() const; |
141 | 121 |
142 private: | 122 private: |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 NetLogCaptureMode capture_mode_; | 183 NetLogCaptureMode capture_mode_; |
204 NetLog* net_log_; | 184 NetLog* net_log_; |
205 | 185 |
206 DISALLOW_COPY_AND_ASSIGN(ThreadSafeObserver); | 186 DISALLOW_COPY_AND_ASSIGN(ThreadSafeObserver); |
207 }; | 187 }; |
208 | 188 |
209 NetLog(); | 189 NetLog(); |
210 virtual ~NetLog(); | 190 virtual ~NetLog(); |
211 | 191 |
212 // Emits a global event to the log stream, with its own unique source ID. | 192 // Emits a global event to the log stream, with its own unique source ID. |
213 void AddGlobalEntry(EventType type); | 193 void AddGlobalEntry(NetLogEventType type); |
214 void AddGlobalEntry(EventType type, | 194 void AddGlobalEntry(NetLogEventType type, |
215 const NetLog::ParametersCallback& parameters_callback); | 195 const NetLog::ParametersCallback& parameters_callback); |
216 | 196 |
217 // Returns a unique ID which can be used as a source ID. All returned IDs | 197 // Returns a unique ID which can be used as a source ID. All returned IDs |
218 // will be unique and greater than 0. | 198 // will be unique and greater than 0. |
219 uint32_t NextID(); | 199 uint32_t NextID(); |
220 | 200 |
221 // Returns true if there are any observers attached to the NetLog. This can be | 201 // Returns true if there are any observers attached to the NetLog. This can be |
222 // used as an optimization to avoid emitting log entries when there is no | 202 // used as an optimization to avoid emitting log entries when there is no |
223 // chance that the data will be consumed. | 203 // chance that the data will be consumed. |
224 bool IsCapturing() const; | 204 bool IsCapturing() const; |
(...skipping 21 matching lines...) Expand all Loading... |
246 // DEPRECATED: The ability to watch the netlog stream is being phased out | 226 // DEPRECATED: The ability to watch the netlog stream is being phased out |
247 // (crbug.com/472693) as it can be misused in production code. Please consult | 227 // (crbug.com/472693) as it can be misused in production code. Please consult |
248 // with a net/log OWNER before introducing a new dependency on this. | 228 // with a net/log OWNER before introducing a new dependency on this. |
249 void DeprecatedRemoveObserver(ThreadSafeObserver* observer); | 229 void DeprecatedRemoveObserver(ThreadSafeObserver* observer); |
250 | 230 |
251 // Converts a time to the string format that the NetLog uses to represent | 231 // Converts a time to the string format that the NetLog uses to represent |
252 // times. Strings are used since integers may overflow. | 232 // times. Strings are used since integers may overflow. |
253 static std::string TickCountToString(const base::TimeTicks& time); | 233 static std::string TickCountToString(const base::TimeTicks& time); |
254 | 234 |
255 // Returns a C-String symbolic name for |event_type|. | 235 // Returns a C-String symbolic name for |event_type|. |
256 static const char* EventTypeToString(EventType event_type); | 236 static const char* EventTypeToString(NetLogEventType event_type); |
257 | 237 |
258 // Returns a dictionary that maps event type symbolic names to their enum | 238 // Returns a dictionary that maps event type symbolic names to their enum |
259 // values. Caller takes ownership of the returned Value. | 239 // values. Caller takes ownership of the returned Value. |
260 static base::Value* GetEventTypesAsValue(); | 240 static base::Value* GetEventTypesAsValue(); |
261 | 241 |
262 // Returns a C-String symbolic name for |source_type|. | 242 // Returns a C-String symbolic name for |source_type|. |
263 static const char* SourceTypeToString(SourceType source_type); | 243 static const char* SourceTypeToString(NetLogSourceType source_type); |
264 | 244 |
265 // Returns a dictionary that maps source type symbolic names to their enum | 245 // Returns a dictionary that maps source type symbolic names to their enum |
266 // values. Caller takes ownership of the returned Value. | 246 // values. Caller takes ownership of the returned Value. |
267 static base::Value* GetSourceTypesAsValue(); | 247 static base::Value* GetSourceTypesAsValue(); |
268 | 248 |
269 // Returns a C-String symbolic name for |event_phase|. | 249 // Returns a C-String symbolic name for |event_phase|. |
270 static const char* EventPhaseToString(EventPhase event_phase); | 250 static const char* EventPhaseToString(NetLogEventPhase event_phase); |
271 | 251 |
272 // Creates a ParametersCallback that encapsulates a single bool. | 252 // Creates a ParametersCallback that encapsulates a single bool. |
273 // Warning: |name| must remain valid for the life of the callback. | 253 // Warning: |name| must remain valid for the life of the callback. |
274 static ParametersCallback BoolCallback(const char* name, bool value); | 254 static ParametersCallback BoolCallback(const char* name, bool value); |
275 | 255 |
276 // Warning: |name| must remain valid for the life of the callback. | 256 // Warning: |name| must remain valid for the life of the callback. |
277 static ParametersCallback IntCallback(const char* name, int value); | 257 static ParametersCallback IntCallback(const char* name, int value); |
278 | 258 |
279 // Creates a ParametersCallback that encapsulates a single int64_t. The | 259 // Creates a ParametersCallback that encapsulates a single int64_t. The |
280 // callback will return the value as a StringValue, since IntegerValues | 260 // callback will return the value as a StringValue, since IntegerValues |
281 // only support 32-bit values. | 261 // only support 32-bit values. |
282 // Warning: |name| must remain valid for the life of the callback. | 262 // Warning: |name| must remain valid for the life of the callback. |
283 static ParametersCallback Int64Callback(const char* name, int64_t value); | 263 static ParametersCallback Int64Callback(const char* name, int64_t value); |
284 | 264 |
285 // Creates a ParametersCallback that encapsulates a single UTF8 string. Takes | 265 // Creates a ParametersCallback that encapsulates a single UTF8 string. Takes |
286 // |value| as a pointer to avoid copying, and emphasize it must be valid for | 266 // |value| as a pointer to avoid copying, and emphasize it must be valid for |
287 // the life of the callback. |value| may not be NULL. | 267 // the life of the callback. |value| may not be NULL. |
288 // Warning: |name| and |value| must remain valid for the life of the callback. | 268 // Warning: |name| and |value| must remain valid for the life of the callback. |
289 static ParametersCallback StringCallback(const char* name, | 269 static ParametersCallback StringCallback(const char* name, |
290 const std::string* value); | 270 const std::string* value); |
291 static ParametersCallback StringCallback(const char* name, const char* value); | 271 static ParametersCallback StringCallback(const char* name, const char* value); |
292 | 272 |
293 // Same as above, but takes in a UTF16 string. | 273 // Same as above, but takes in a UTF16 string. |
294 static ParametersCallback StringCallback(const char* name, | 274 static ParametersCallback StringCallback(const char* name, |
295 const base::string16* value); | 275 const base::string16* value); |
296 | 276 |
297 private: | 277 private: |
298 friend class BoundNetLog; | 278 friend class BoundNetLog; |
299 | 279 |
300 void AddEntry(EventType type, | 280 void AddEntry(NetLogEventType type, |
301 const Source& source, | 281 const Source& source, |
302 EventPhase phase, | 282 NetLogEventPhase phase, |
303 const NetLog::ParametersCallback* parameters_callback); | 283 const NetLog::ParametersCallback* parameters_callback); |
304 | 284 |
305 // Called whenever an observer is added or removed, to update | 285 // Called whenever an observer is added or removed, to update |
306 // |has_observers_|. Must have acquired |lock_| prior to calling. | 286 // |has_observers_|. Must have acquired |lock_| prior to calling. |
307 void UpdateIsCapturing(); | 287 void UpdateIsCapturing(); |
308 | 288 |
309 // |lock_| protects access to |observers_|. | 289 // |lock_| protects access to |observers_|. |
310 base::Lock lock_; | 290 base::Lock lock_; |
311 | 291 |
312 // Last assigned source ID. Incremented to get the next one. | 292 // Last assigned source ID. Incremented to get the next one. |
(...skipping 11 matching lines...) Expand all Loading... |
324 }; | 304 }; |
325 | 305 |
326 // Helper that binds a Source to a NetLog, and exposes convenience methods to | 306 // Helper that binds a Source to a NetLog, and exposes convenience methods to |
327 // output log messages without needing to pass in the source. | 307 // output log messages without needing to pass in the source. |
328 class NET_EXPORT BoundNetLog { | 308 class NET_EXPORT BoundNetLog { |
329 public: | 309 public: |
330 BoundNetLog() : net_log_(NULL) {} | 310 BoundNetLog() : net_log_(NULL) {} |
331 ~BoundNetLog(); | 311 ~BoundNetLog(); |
332 | 312 |
333 // Add a log entry to the NetLog for the bound source. | 313 // Add a log entry to the NetLog for the bound source. |
334 void AddEntry(NetLog::EventType type, NetLog::EventPhase phase) const; | 314 void AddEntry(NetLogEventType type, NetLogEventPhase phase) const; |
335 void AddEntry(NetLog::EventType type, | 315 void AddEntry(NetLogEventType type, |
336 NetLog::EventPhase phase, | 316 NetLogEventPhase phase, |
337 const NetLog::ParametersCallback& get_parameters) const; | 317 const NetLog::ParametersCallback& get_parameters) const; |
338 | 318 |
339 // Convenience methods that call AddEntry with a fixed "capture phase" | 319 // Convenience methods that call AddEntry with a fixed "capture phase" |
340 // (begin, end, or none). | 320 // (begin, end, or none). |
341 void BeginEvent(NetLog::EventType type) const; | 321 void BeginEvent(NetLogEventType type) const; |
342 void BeginEvent(NetLog::EventType type, | 322 void BeginEvent(NetLogEventType type, |
343 const NetLog::ParametersCallback& get_parameters) const; | 323 const NetLog::ParametersCallback& get_parameters) const; |
344 | 324 |
345 void EndEvent(NetLog::EventType type) const; | 325 void EndEvent(NetLogEventType type) const; |
346 void EndEvent(NetLog::EventType type, | 326 void EndEvent(NetLogEventType type, |
347 const NetLog::ParametersCallback& get_parameters) const; | 327 const NetLog::ParametersCallback& get_parameters) const; |
348 | 328 |
349 void AddEvent(NetLog::EventType type) const; | 329 void AddEvent(NetLogEventType type) const; |
350 void AddEvent(NetLog::EventType type, | 330 void AddEvent(NetLogEventType type, |
351 const NetLog::ParametersCallback& get_parameters) const; | 331 const NetLog::ParametersCallback& get_parameters) const; |
352 | 332 |
353 // Just like AddEvent, except |net_error| is a net error code. A parameter | 333 // Just like AddEvent, except |net_error| is a net error code. A parameter |
354 // called "net_error" with the indicated value will be recorded for the event. | 334 // called "net_error" with the indicated value will be recorded for the event. |
355 // |net_error| must be negative, and not ERR_IO_PENDING, as it's not a true | 335 // |net_error| must be negative, and not ERR_IO_PENDING, as it's not a true |
356 // error. | 336 // error. |
357 void AddEventWithNetErrorCode(NetLog::EventType event_type, | 337 void AddEventWithNetErrorCode(NetLogEventType event_type, |
358 int net_error) const; | 338 int net_error) const; |
359 | 339 |
360 // Just like EndEvent, except |net_error| is a net error code. If it's | 340 // Just like EndEvent, except |net_error| is a net error code. If it's |
361 // negative, a parameter called "net_error" with a value of |net_error| is | 341 // negative, a parameter called "net_error" with a value of |net_error| is |
362 // associated with the event. Otherwise, the end event has no parameters. | 342 // associated with the event. Otherwise, the end event has no parameters. |
363 // |net_error| must not be ERR_IO_PENDING, as it's not a true error. | 343 // |net_error| must not be ERR_IO_PENDING, as it's not a true error. |
364 void EndEventWithNetErrorCode(NetLog::EventType event_type, | 344 void EndEventWithNetErrorCode(NetLogEventType event_type, |
365 int net_error) const; | 345 int net_error) const; |
366 | 346 |
367 // Logs a byte transfer event to the NetLog. Determines whether to log the | 347 // Logs a byte transfer event to the NetLog. Determines whether to log the |
368 // received bytes or not based on the current logging level. | 348 // received bytes or not based on the current logging level. |
369 void AddByteTransferEvent(NetLog::EventType event_type, | 349 void AddByteTransferEvent(NetLogEventType event_type, |
370 int byte_count, | 350 int byte_count, |
371 const char* bytes) const; | 351 const char* bytes) const; |
372 | 352 |
373 bool IsCapturing() const; | 353 bool IsCapturing() const; |
374 | 354 |
375 // Helper to create a BoundNetLog given a NetLog and a SourceType. Takes care | 355 // Helper to create a BoundNetLog given a NetLog and a NetLogSourceType. |
376 // of creating a unique source ID, and handles the case of NULL net_log. | 356 // Takes care of creating a unique source ID, and handles |
377 static BoundNetLog Make(NetLog* net_log, NetLog::SourceType source_type); | 357 // the case of NULL net_log. |
| 358 static BoundNetLog Make(NetLog* net_log, NetLogSourceType source_type); |
378 | 359 |
379 const NetLog::Source& source() const { return source_; } | 360 const NetLog::Source& source() const { return source_; } |
380 NetLog* net_log() const { return net_log_; } | 361 NetLog* net_log() const { return net_log_; } |
381 | 362 |
382 private: | 363 private: |
383 // TODO(eroman): Temporary until crbug.com/467797 is solved. | 364 // TODO(eroman): Temporary until crbug.com/467797 is solved. |
384 enum Liveness { | 365 enum Liveness { |
385 ALIVE = 0xCA11AB13, | 366 ALIVE = 0xCA11AB13, |
386 DEAD = 0xDEADBEEF, | 367 DEAD = 0xDEADBEEF, |
387 }; | 368 }; |
388 | 369 |
389 BoundNetLog(const NetLog::Source& source, NetLog* net_log) | 370 BoundNetLog(const NetLog::Source& source, NetLog* net_log) |
390 : source_(source), net_log_(net_log) {} | 371 : source_(source), net_log_(net_log) {} |
391 | 372 |
392 // TODO(eroman): Temporary until crbug.com/467797 is solved. | 373 // TODO(eroman): Temporary until crbug.com/467797 is solved. |
393 void CrashIfInvalid() const; | 374 void CrashIfInvalid() const; |
394 | 375 |
395 NetLog::Source source_; | 376 NetLog::Source source_; |
396 NetLog* net_log_; | 377 NetLog* net_log_; |
397 | 378 |
398 // TODO(eroman): Temporary until crbug.com/467797 is solved. | 379 // TODO(eroman): Temporary until crbug.com/467797 is solved. |
399 Liveness liveness_ = ALIVE; | 380 Liveness liveness_ = ALIVE; |
400 }; | 381 }; |
401 | 382 |
402 } // namespace net | 383 } // namespace net |
403 | 384 |
404 #endif // NET_LOG_NET_LOG_H_ | 385 #endif // NET_LOG_NET_LOG_H_ |
OLD | NEW |