Skip to content

Commit 815297c

Browse files
committed
Added performance log handler.
1 parent 23989c2 commit 815297c

File tree

6 files changed

+101
-1
lines changed

6 files changed

+101
-1
lines changed

inc/webdriver_logging.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class LogType {
4242
kInvalid = -1, /// invalid type
4343
kDriver, /// driver
4444
kBrowser, /// browser (console.log)
45+
kPerformance, /// performance
4546
kNum /// number of sources
4647
};
4748

@@ -162,6 +163,43 @@ class InMemoryLog : public LogHandler {
162163
DISALLOW_COPY_AND_ASSIGN(InMemoryLog);
163164
};
164165

166+
/// Performance log handler.<br>
167+
/// <b>Limitation:</b> currently we can collect Performance Logs only for QWebViewExt.<br>
168+
/// If you need receive perf logs for other QWebViews or their subclasses,
169+
/// you should change the network access manager before the QWebPage has used it
170+
/// (in other cases the results of doing this are undefined) :
171+
/// @code
172+
/// QWebView* view = new QWebView;;
173+
/// QNetworkAccessManager* manager = new QNetworkAccessManagerTracer(session, view->page());
174+
/// view->page()->setNetworkAccessManager(manager);
175+
/// @endcode
176+
/// before the first call to the page. After that you can connect to the window.
177+
/// <p>In other case you can change manager in constructor custom webviews like QWebViewExt.
178+
/// Then you can register and use it as usually :
179+
/// @code
180+
/// webdriver::ViewCreator* webCreator = new webdriver::QWebViewCreator();
181+
/// webCreator->RegisterViewClass<CustomWebView>("CustomWebView");
182+
/// webdriver::ViewFactory::GetInstance()->AddViewCreator(webCreator);
183+
/// @endcode
184+
/// <p>If your CustomWebView class is overriding createWindow method of QWebView,
185+
/// you should ensure that new windows will use needed network access manager with logs support.
186+
187+
class PerfLog : public InMemoryLog {
188+
public:
189+
PerfLog();
190+
virtual ~PerfLog();
191+
virtual void Log(LogLevel level, const base::Time& time,
192+
const std::string& message) OVERRIDE;
193+
194+
void set_min_log_level(LogLevel level);
195+
LogLevel min_log_level();
196+
197+
private:
198+
LogLevel min_log_level_;
199+
200+
DISALLOW_COPY_AND_ASSIGN(PerfLog);
201+
};
202+
165203
/// Forwards logging messages to added logs.
166204
class Logger {
167205
public:

inc/webdriver_session.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,14 @@ class Session {
113113
/// returned value.
114114
base::ListValue* GetLog() const;
115115

116+
void AddPerfLogEntry(LogLevel level, const std::string& message);
117+
118+
/// Return current minimum LogLevel for Performance Logging, by default kOffLogLevel.
119+
LogLevel GetMinPerfLogLevel() const;
120+
121+
/// Returns a copy of the current performance log entries.
122+
base::ListValue* GetPerfLog() const;
123+
116124
/// Runs task in session's context
117125
/// @param task task to run
118126
void RunSessionTask(const base::Closure& task);
@@ -233,6 +241,7 @@ class Session {
233241
base::WaitableEvent* done_event);
234242

235243
scoped_ptr<InMemoryLog> session_log_;
244+
scoped_ptr<PerfLog> session_perf_log_;
236245
Logger logger_;
237246

238247
// session id

src/webdriver/commands/log_command.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ void LogCommand::ExecutePost(Response* const response) {
4545
if (log_type.type() == LogType::kDriver) {
4646
response->SetValue(session_->GetLog());
4747
}
48+
else if (log_type.type() == LogType::kPerformance) {
49+
response->SetValue(session_->GetPerfLog());
50+
}
4851
else if (log_type.type() == LogType::kBrowser) {
4952
Error* error = NULL;
5053

@@ -85,6 +88,9 @@ void LogTypesCommand::ExecuteGet(Response* const response) {
8588
base::ListValue* logTypes_list = new base::ListValue();
8689
logTypes_list->Append(Value::CreateStringValue(LogType(LogType::kDriver).ToString()));
8790
logTypes_list->Append(Value::CreateStringValue(LogType(LogType::kBrowser).ToString()));
91+
if (session_->GetMinPerfLogLevel() != kOffLogLevel) {
92+
logTypes_list->Append(Value::CreateStringValue(LogType(LogType::kPerformance).ToString()));
93+
}
8894
response->SetValue(logTypes_list);
8995
}
9096

src/webdriver/webdriver_capabilities_parser.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ Capabilities::Capabilities()
6767
caps(new DictionaryValue()) {
6868
log_levels[LogType::kDriver] = kAllLogLevel;
6969
log_levels[LogType::kBrowser] = kAllLogLevel;
70+
// disabled by default
71+
log_levels[LogType::kPerformance] = kOffLogLevel;
7072
}
7173

7274
Capabilities::~Capabilities() { }

src/webdriver/webdriver_logging.cc

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ bool LogType::FromString(const std::string& name, LogType* log_type) {
7171
*log_type = LogType(kDriver);
7272
} else if (name == "browser") {
7373
*log_type = LogType(kBrowser);
74-
} else{
74+
} else if (name == "performance") {
75+
*log_type = LogType(kPerformance);
76+
} else {
7577
return false;
7678
}
7779
return true;
@@ -89,6 +91,8 @@ std::string LogType::ToString() const {
8991
return "driver";
9092
case kBrowser:
9193
return "browser";
94+
case kPerformance:
95+
return "performance";
9296
default:
9397
return "unknown";
9498
};
@@ -280,6 +284,25 @@ void InMemoryLog::clear_entries_list() {
280284
entries_list_.Clear();
281285
}
282286

287+
PerfLog::PerfLog(): min_log_level_(kOffLogLevel) { }
288+
289+
PerfLog::~PerfLog() { }
290+
291+
void PerfLog::set_min_log_level(LogLevel level) {
292+
min_log_level_= level;
293+
}
294+
295+
LogLevel PerfLog::min_log_level() {
296+
return min_log_level_;
297+
}
298+
299+
void PerfLog::Log(LogLevel level, const base::Time &time, const std::string &message) {
300+
if (level < min_log_level_) {
301+
return;
302+
}
303+
InMemoryLog::Log(level, time, message);
304+
}
305+
283306
Logger::Logger() : min_log_level_(kAllLogLevel) { }
284307

285308
Logger::Logger(LogLevel level) : min_log_level_(level) { }

src/webdriver/webdriver_session.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ namespace webdriver {
4141

4242
Session::Session()
4343
: session_log_(new InMemoryLog()),
44+
session_perf_log_(new PerfLog()),
4445
logger_(kAllLogLevel),
4546
id_(GenerateRandomID()),
4647
current_view_id_(ViewId()),
@@ -295,6 +296,9 @@ Error* Session::Init(const base::DictionaryValue* desired_capabilities_dict,
295296
return error;
296297
}
297298
logger_.set_min_log_level(capabilities_.log_levels[LogType::kDriver]);
299+
if (capabilities_.log_levels[LogType::kPerformance] != kOffLogLevel) {
300+
session_perf_log_->set_min_log_level(capabilities_.log_levels[LogType::kPerformance]);
301+
}
298302

299303
error = life_cycle_actions_->PostInit(desired_capabilities_dict, required_capabilities_dict);
300304

@@ -412,6 +416,24 @@ base::ListValue* Session::GetLog() const {
412416
return ret_val;
413417
}
414418

419+
void Session::AddPerfLogEntry(LogLevel level, const std::string& message) {
420+
if (!session_perf_log_.get()) {
421+
return;
422+
}
423+
base::Time time = base::Time::Now();
424+
session_perf_log_->Log(level, time, message);
425+
}
426+
427+
LogLevel Session::GetMinPerfLogLevel() const {
428+
return session_perf_log_->min_log_level();
429+
}
430+
431+
base::ListValue* Session::GetPerfLog() const {
432+
base::ListValue* ret_val = session_perf_log_->entries_list()->DeepCopy();
433+
session_perf_log_->clear_entries_list();
434+
return ret_val;
435+
}
436+
415437
void Session::RunSessionTask(const base::Closure& task) {
416438
base::WaitableEvent done_event(false, false);
417439
thread_.message_loop_proxy()->PostTask(FROM_HERE, base::Bind(

0 commit comments

Comments
 (0)