Skip to content

Commit 6e37fa3

Browse files
committed
added QNetworkAccessManagerTracer - auxiliary class for performance logging support.
1 parent 815297c commit 6e37fa3

File tree

5 files changed

+227
-2
lines changed

5 files changed

+227
-2
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/****************************************************************************
2+
**
3+
** Copyright © 1992-2014 Cisco and/or its affiliates. All rights reserved.
4+
** All rights reserved.
5+
**
6+
** $CISCO_BEGIN_LICENSE:LGPL$
7+
**
8+
** GNU Lesser General Public License Usage
9+
** Alternatively, this file may be used under the terms of the GNU Lesser
10+
** General Public License version 2.1 as published by the Free Software
11+
** Foundation and appearing in the file LICENSE.LGPL included in the
12+
** packaging of this file. Please review the following information to
13+
** ensure the GNU Lesser General Public License version 2.1 requirements
14+
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
15+
**
16+
** $CISCO_END_LICENSE$
17+
**
18+
****************************************************************************/
19+
20+
#ifndef NETWORK_ACCESS_MANAGER_H
21+
#define NETWORK_ACCESS_MANAGER_H
22+
23+
#include <string>
24+
#include <QtNetwork/QNetworkAccessManager>
25+
26+
namespace webdriver {
27+
class Session;
28+
}
29+
30+
/// Auxiliary class for performance logging support.<br>
31+
/// Limitation: It is currently not supported to change the network access manager after the QWebPage has used it.
32+
class QNetworkAccessManagerTracer: public QNetworkAccessManager {
33+
Q_OBJECT
34+
public:
35+
/// Create custom network access manager.
36+
/// @param session pointer to Session object.
37+
/// @param parent set as the parent object.
38+
QNetworkAccessManagerTracer(webdriver::Session* session, QObject* parent = 0);
39+
40+
virtual ~QNetworkAccessManagerTracer();
41+
42+
protected:
43+
/// Overrided, additional write a JSON entry for every received reply.
44+
virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest& req, QIODevice* outgoingData = 0);
45+
46+
protected slots:
47+
/// Create single log entry and add it to session's performance log.
48+
/// <br>Currently WebDriver supports only Performance Log of Network.
49+
/// <p>Each entry is a JSON string of the following structure:
50+
/// @code
51+
/// {
52+
/// "webview": "class_name",
53+
/// "message": {
54+
/// "args": {
55+
/// "file": "file_path/name",
56+
/// "method": "HTTP_method",
57+
/// "status": "HTTP_status_code",
58+
/// },
59+
/// "tid": "thread_id",
60+
/// "ts": "timestamp",
61+
/// "tts": "thread-specific_CPU-time"
62+
/// }
63+
/// }
64+
/// @endcode
65+
/// @param reply pointer to reply, that contains the data which will be written to PerfLog.
66+
void writeReply(QNetworkReply* reply);
67+
68+
private:
69+
std::string getMethod(Operation op);
70+
webdriver::Session* session_;
71+
double timeStamp_;
72+
};
73+
74+
#endif //NETWORK_ACCESS_MANAGER_H

inc/extension_qt/qwebviewext.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include <QtWebKit/QtWebKit>
1010
#endif
1111

12+
class QNetworkAccessManagerTracer;
13+
1214
class QWebViewExt : public QWebView
1315
{
1416
Q_OBJECT
@@ -22,7 +24,8 @@ class QWebViewExt : public QWebView
2224

2325
private:
2426
void setWebInspectorProperty(QWebViewExt* view);
25-
27+
void setNetworkAccessManagerTracer();
28+
QNetworkAccessManagerTracer* manager_;
2629
};
2730

2831
#endif // QWEBVIEWEXT_H
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/****************************************************************************
2+
**
3+
** Copyright © 1992-2014 Cisco and/or its affiliates. All rights reserved.
4+
** All rights reserved.
5+
**
6+
** $CISCO_BEGIN_LICENSE:LGPL$
7+
**
8+
** GNU Lesser General Public License Usage
9+
** Alternatively, this file may be used under the terms of the GNU Lesser
10+
** General Public License version 2.1 as published by the Free Software
11+
** Foundation and appearing in the file LICENSE.LGPL included in the
12+
** packaging of this file. Please review the following information to
13+
** ensure the GNU Lesser General Public License version 2.1 requirements
14+
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
15+
**
16+
** $CISCO_END_LICENSE$
17+
**
18+
****************************************************************************/
19+
20+
#include "extension_qt/qnetwork_access_manager_tracer.h"
21+
#include "webdriver_session.h"
22+
#include "webdriver_util.h"
23+
#include "web_view_util.h"
24+
25+
#include "base/values.h"
26+
#include "base/time.h"
27+
#include "base/threading/platform_thread.h"
28+
#include "base/string_number_conversions.h"
29+
30+
#include <QtCore/QThread>
31+
#include <QtNetwork/QNetworkReply>
32+
33+
QNetworkAccessManagerTracer::QNetworkAccessManagerTracer(webdriver::Session* session, QObject* parent)
34+
: QNetworkAccessManager(parent), session_(session) {
35+
}
36+
37+
QNetworkAccessManagerTracer::~QNetworkAccessManagerTracer() { }
38+
39+
QNetworkReply* QNetworkAccessManagerTracer::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData) {
40+
41+
timeStamp_ = static_cast<double>(base::TimeTicks::NowFromSystemTraceTime().ToInternalValue());
42+
QNetworkReply* reply = QNetworkAccessManager::createRequest(op, req, outgoingData);
43+
connect(this, SIGNAL(finished(QNetworkReply*)), this, SLOT(writeReply(QNetworkReply*)));
44+
45+
return reply;
46+
}
47+
48+
void QNetworkAccessManagerTracer::writeReply(QNetworkReply *reply) {
49+
webdriver::LogLevel level = session_->GetMinPerfLogLevel();
50+
51+
double thread_timestamp = static_cast<double>((base::TimeTicks::IsThreadNowSupported() ?
52+
base::TimeTicks::ThreadNow() : base::TimeTicks()).ToInternalValue());
53+
54+
std::string file = reply->url().path().toStdString();
55+
// delete '/' in the beginning:
56+
file.erase(0, 1);
57+
58+
//HTTP status code
59+
QVariant statusCode = reply->attribute( QNetworkRequest::HttpStatusCodeAttribute );
60+
QString reason;
61+
if ( !statusCode.isValid() ) {
62+
reason = "INVALID";
63+
level = webdriver::LogLevelFromString("SEVERE");
64+
} else {
65+
int status = statusCode.toInt();
66+
if ( status != 200 ) {
67+
level = webdriver::LogLevelFromString("WARNING");
68+
} else {
69+
level = webdriver::LogLevelFromString("INFO");
70+
}
71+
reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
72+
}
73+
base::DictionaryValue* args_entry = new base::DictionaryValue();
74+
args_entry->SetString("method", getMethod(reply->operation()));
75+
args_entry->SetString("status", reason.toStdString());
76+
args_entry->SetString("file", file);
77+
78+
base::DictionaryValue* message_entry = new base::DictionaryValue();
79+
message_entry->Set("args", args_entry);
80+
message_entry->SetDouble("ts", timeStamp_);
81+
message_entry->SetInteger("tid", static_cast<int>(base::PlatformThread::CurrentId()));
82+
message_entry->SetDouble("tts", thread_timestamp);
83+
84+
base::DictionaryValue* entry = new base::DictionaryValue;
85+
std::string webview = webdriver::QWebViewUtil::getWebView(session_,session_->current_view())->metaObject()->className();
86+
entry->SetString("webview", webview);
87+
entry->Set("message", message_entry);
88+
std::string log_entry = webdriver::JsonStringifyForDisplay(entry);
89+
90+
session_->AddPerfLogEntry(level, log_entry);
91+
delete entry;
92+
93+
}
94+
95+
std::string QNetworkAccessManagerTracer::getMethod(QNetworkAccessManager::Operation op) {
96+
std::string method;
97+
switch (op) {
98+
case QNetworkAccessManager::HeadOperation:
99+
method = "HEAD";
100+
break;
101+
case QNetworkAccessManager::GetOperation:
102+
method = "GET";
103+
break;
104+
case QNetworkAccessManager::PutOperation:
105+
method= "PUT";
106+
break;
107+
case QNetworkAccessManager::PostOperation:
108+
method = "POST";
109+
break;
110+
case QNetworkAccessManager::DeleteOperation:
111+
method = "DELETE";
112+
break;
113+
case QNetworkAccessManager::CustomOperation:
114+
method = "custom";
115+
break;
116+
default:
117+
method = "unsupported method";
118+
break;
119+
}
120+
return method;
121+
}
122+

src/webdriver/extension_qt/qwebviewext.cc

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
#include "extension_qt/qwebviewext.h"
22
#include "webdriver_server.h"
3+
#include "webdriver_session_manager.h"
4+
#include "webdriver_session.h"
5+
#include "webdriver_logging.h"
6+
#include "extension_qt/qnetwork_access_manager_tracer.h"
37
#include <QtCore/QVariant>
48
#include <QtCore/QTime>
59
#include <QtCore/QDebug>
@@ -14,16 +18,18 @@
1418
#endif
1519

1620
QWebViewExt::QWebViewExt(QWidget *parent) :
17-
QWebView(parent)
21+
QWebView(parent), manager_(0)
1822
{
1923
setVisible(false);
2024
setWebInspectorProperty(this);
25+
setNetworkAccessManagerTracer();
2126
connect(page(), SIGNAL(windowCloseRequested()), this, SLOT(close()));
2227
connect(this, SIGNAL(titleChanged(QString)), this, SLOT(setWindowTitle(QString)));
2328
}
2429

2530
QWebViewExt::~QWebViewExt()
2631
{
32+
delete manager_;
2733
}
2834

2935
QWebView* QWebViewExt::createWindow(QWebPage::WebWindowType type)
@@ -56,3 +62,20 @@ void QWebViewExt::setWebInspectorProperty(QWebViewExt *view)
5662
}
5763
}
5864

65+
void QWebViewExt::setNetworkAccessManagerTracer()
66+
{
67+
std::map<std::string, webdriver::Session*> sessionMap = webdriver::SessionManager::GetInstance()->GetSessions();
68+
if (sessionMap.size() != 1)
69+
{
70+
webdriver::GlobalLogger::Log(webdriver::kWarningLogLevel, "Session should be initialized");
71+
return;
72+
}
73+
webdriver::Session* session = sessionMap.begin()->second;
74+
if (session->GetMinPerfLogLevel() == webdriver::kOffLogLevel)
75+
{
76+
webdriver::GlobalLogger::Log(webdriver::kInfoLogLevel, "Performance Log is disabled by defaul");
77+
return;
78+
}
79+
manager_ = new QNetworkAccessManagerTracer(session, this->page());
80+
this->page()->setNetworkAccessManager(manager_);
81+
}

wd_ext_qt.gyp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,16 @@
8181
'src/webdriver/extension_qt/web_view_util.cc',
8282
'src/webdriver/extension_qt/qwebkit_proxy.cc',
8383
'src/webdriver/extension_qt/qwebkit_proxy.h',
84+
'inc/extension_qt/qnetwork_access_manager_tracer.h',
85+
'src/webdriver/extension_qt/qnetwork_access_manager_tracer.cc',
8486
'src/webdriver/extension_qt/graphics_web_view_handle.cc',
8587
'src/webdriver/extension_qt/graphics_web_view_enumerator.cc',
8688
'src/webdriver/extension_qt/graphics_web_view_executor.cc',
8789
'inc/extension_qt/qwebviewext.h',
8890
'<(INTERMEDIATE_DIR)/moc_web_view_visualizer.cc',
8991
'<(INTERMEDIATE_DIR)/moc_qwebviewext.cc',
9092
'<(INTERMEDIATE_DIR)/moc_qwebkit_proxy.cc',
93+
'<(INTERMEDIATE_DIR)/moc_qnetwork_access_manager_tracer.cc',
9194
'src/third_party/webdriver/atoms.cc',
9295
],
9396

0 commit comments

Comments
 (0)