1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// found in the LICENSE file.
4b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef CHROME_TEST_CHROMEDRIVER_PERFORMANCE_LOGGER_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define CHROME_TEST_CHROMEDRIVER_PERFORMANCE_LOGGER_H_
7b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/basictypes.h"
11b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/compiler_specific.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/test/chromedriver/capabilities.h"
13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/devtools_event_listener.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/test/chromedriver/command_listener.h"
15b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class Log;
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct Session;
18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Translates DevTools profiler events into Log messages with info level.
20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)//
21b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// The message is a JSON string of the following structure:
22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// {
23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)//    "webview": <originating WebView ID>,
24b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)//    "message": { "method": "...", "params": { ... }}  // DevTools message.
25b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// }
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)//
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Also translates buffered trace events into Log messages of info level with
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// the same structure if tracing categories are specified.
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass PerformanceLogger : public DevToolsEventListener, public CommandListener {
31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Creates a |PerformanceLogger| with default preferences that creates entries
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // in the given Log object. The log is owned elsewhere and must not be null.
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PerformanceLogger(Log* log, const Session* session);
35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Creates a |PerformanceLogger| with specific preferences.
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PerformanceLogger(Log* log,
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                    const Session* session,
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                    const PerfLoggingPrefs& prefs);
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // PerformanceLogger subscribes to browser-wide |DevToolsClient| for tracing.
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual bool subscribes_to_browser() OVERRIDE;
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // For browser-wide client: enables tracing if trace categories are specified,
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // sets |browser_client_|. For other clients: calls EnableInspectorDomains.
46b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual Status OnConnected(DevToolsClient* client) OVERRIDE;
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Calls HandleInspectorEvents or HandleTraceEvents depending on client type.
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual Status OnEvent(DevToolsClient* client,
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         const std::string& method,
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         const base::DictionaryValue& params) OVERRIDE;
52b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Before whitelisted commands, if tracing enabled, calls CollectTraceEvents.
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual Status BeforeCommand(const std::string& command_name) OVERRIDE;
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
56b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) private:
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void AddLogEntry(Log::Level level,
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                   const std::string& webview,
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                   const std::string& method,
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                   const base::DictionaryValue& params);
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void AddLogEntry(const std::string& webview,
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                   const std::string& method,
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                   const base::DictionaryValue& params);
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Enables Network, Page and Timeline domains according to |PerfLoggingPrefs|.
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Status EnableInspectorDomains(DevToolsClient* client);
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Logs Network, Page, and Timeline events.
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Status HandleInspectorEvents(DevToolsClient* client,
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                               const std::string& method,
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                               const base::DictionaryValue& params);
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Logs trace events and monitors trace buffer usage.
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Status HandleTraceEvents(DevToolsClient* client,
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           const std::string& method,
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           const base::DictionaryValue& params);
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool ShouldReportTracingError();
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Status StartTrace();  // Must not call before browser-wide client connects.
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Status CollectTraceEvents();  // Ditto.
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Status IsTraceDone(bool* trace_done) const; // True if trace is not buffering.
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Log* log_;  // The log where to create entries.
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const Session* session_;
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PerfLoggingPrefs prefs_;
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DevToolsClient* browser_client_; // Pointer to browser-wide |DevToolsClient|.
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool trace_buffering_;  // True unless trace stopped and all events received.
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PerformanceLogger);
91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
92b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // CHROME_TEST_CHROMEDRIVER_PERFORMANCE_LOGGER_H_
94