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