Skip to content

Commit c4ce066

Browse files
committed
Browser log support
1 parent e869b87 commit c4ce066

File tree

7 files changed

+180
-13
lines changed

7 files changed

+180
-13
lines changed

src/chrome/test/webdriver/commands/log_command.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ void LogCommand::ExecutePost(Response* const response) {
3838
return;
3939
}
4040

41-
if (log_type.type() == LogType::kDriver) {
42-
response->SetValue(session_->GetLog());
41+
if ((log_type.type() == LogType::kDriver) || (log_type.type() == LogType::kBrowser)) {
42+
response->SetValue(session_->GetLog(log_type.type()));
4343
} else {
4444
response->SetError(new Error(kUnknownError, "Unrecognized type: " + type));
4545
return;
@@ -62,7 +62,7 @@ bool LogTypesCommand::DoesGet() {
6262
void LogTypesCommand::ExecuteGet(Response* const response) {
6363
base::ListValue* logTypes_list = new base::ListValue();
6464
logTypes_list->Append(Value::CreateStringValue(LogType(LogType::kDriver).ToString()));
65-
65+
logTypes_list->Append(Value::CreateStringValue(LogType(LogType::kBrowser).ToString()));
6666
response->SetValue(logTypes_list);
6767
}
6868

src/chrome/test/webdriver/webdriver_automation.cc

Lines changed: 112 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ Automation::Automation(const Logger& logger)
9494
: logger_(logger),
9595
build_no_(0),
9696
isLoading(false),
97-
sessionId(0)
97+
sessionId(0),
98+
jslogger()
9899
{
99100
}
100101

@@ -239,7 +240,13 @@ void Automation::Init(const BrowserOptions& options, int* build_no, Error** erro
239240
if (options.command.HasSwitch(switches::kStartMaximized))
240241
pStartView->showMaximized();
241242

242-
if (SessionManager::GetInstance()->is_wi_enabled())
243+
//JS Console log redefinition
244+
connect(pStartView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(loadJSLogObject()));
245+
connect(pStartView, SIGNAL(loadFinished(bool)),this, SLOT(loadConsoleJS()), Qt::QueuedConnection);
246+
loadJSLogObject(pStartView->page()->mainFrame());
247+
loadConsoleJS(pStartView);
248+
249+
if (SessionManager::GetInstance()->is_wi_enabled())
243250
{
244251
pStartView->page()->setProperty("_q_webInspectorServerPort", SessionManager::GetInstance()->get_wi_port());
245252
}
@@ -2210,6 +2217,37 @@ void Automation::SetAlertPromptText(const WebViewId& view_id, const std::string
22102217
}
22112218
}
22122219

2220+
void Automation::GetBrowserLog(base::ListValue **log)
2221+
{
2222+
*log = jslogger.getLog();
2223+
}
2224+
2225+
void Automation::ResetBrowserCurrentView(const WebViewId& old_view_id, const WebViewId& new_view_id, Error **error)
2226+
{
2227+
if(checkView(old_view_id))
2228+
{
2229+
QWebView *view = qobject_cast<QWebView*>(old_view_id.GetView());
2230+
disconnect(view->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(loadJSLogObject()));
2231+
}
2232+
2233+
if(!checkView(new_view_id))
2234+
{
2235+
*error = new Error(kNoSuchWindow);
2236+
return;
2237+
}
2238+
2239+
QWebView *view = qobject_cast<QWebView*>(new_view_id.GetView());
2240+
2241+
if (view)
2242+
{
2243+
//JS Console log redefinition
2244+
connect(view->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(loadJSLogObject()));
2245+
connect(view, SIGNAL(loadFinished(bool)),this, SLOT(loadConsoleJS()), Qt::QueuedConnection);
2246+
loadJSLogObject(view->page()->mainFrame());
2247+
loadConsoleJS(view);
2248+
}
2249+
}
2250+
22132251
QWebFrame* Automation::FindFrameByPath(QWebFrame* parent, const FramePath &frame_path)
22142252
{
22152253
if (frame_path.value().empty())
@@ -2347,10 +2385,54 @@ void Automation::pageLoadStarted()
23472385
}
23482386

23492387
void Automation::pageLoadFinished()
2350-
{
2388+
{
23512389
isLoading = false;
23522390
}
23532391

2392+
void Automation::loadJSLogObject()
2393+
{
2394+
QWebFrame *mainFrame = qobject_cast<QWebFrame*>(sender());
2395+
if (mainFrame)
2396+
loadJSLogObject(mainFrame);
2397+
}
2398+
2399+
void Automation::loadJSLogObject(QWebFrame *frame)
2400+
{
2401+
frame->addToJavaScriptWindowObject("wdconsole", &jslogger);
2402+
}
2403+
2404+
void Automation::loadConsoleJS()
2405+
{
2406+
QWebView* view = qobject_cast<QWebView*>(sender());
2407+
if (view)
2408+
loadConsoleJS(view);
2409+
}
2410+
2411+
void Automation::loadConsoleJS(const QWebView *view)
2412+
{
2413+
QString jscript ("if ( _log == null ){"
2414+
"var _log = console.log,"
2415+
"_warn = console.warn,"
2416+
"_error = console.error;"
2417+
"};"
2418+
2419+
"console.log = function() {"
2420+
"wdconsole.log(arguments[0]);"
2421+
"return _log.apply(console, arguments);"
2422+
"};"
2423+
2424+
"console.warn = function() {"
2425+
"wdconsole.warn(arguments[0]);"
2426+
"return _warn.apply(console, arguments);"
2427+
"};"
2428+
2429+
"console.error = function() {"
2430+
"wdconsole.error(arguments[0]);"
2431+
"return _error.apply(console, arguments);"
2432+
"};");
2433+
view->page()->mainFrame()->evaluateJavaScript(jscript);
2434+
}
2435+
23542436
JSNotifier::JSNotifier():
23552437
isCompleted(false)
23562438
{
@@ -2373,6 +2455,33 @@ void JSNotifier::setResult(QVariant result)
23732455
emit completed();
23742456
}
23752457

2458+
JSLogger::JSLogger()
2459+
{
2460+
browserLogger.AddHandler(&browserLog);
2461+
}
2462+
2463+
base::ListValue* JSLogger::getLog()
2464+
{
2465+
base::ListValue* retVal = browserLog.entries_list()->DeepCopy();
2466+
browserLog.clear_entries_list();
2467+
return retVal;
2468+
}
2469+
2470+
void JSLogger::log(QVariant message)
2471+
{
2472+
browserLogger.Log(kInfoLogLevel, message.toString().toStdString());
2473+
}
2474+
2475+
void JSLogger::warn(QVariant message)
2476+
{
2477+
browserLogger.Log(kWarningLogLevel, message.toString().toStdString());
2478+
}
2479+
2480+
void JSLogger::error(QVariant message)
2481+
{
2482+
browserLogger.Log(kSevereLogLevel, message.toString().toStdString());
2483+
}
2484+
23762485
//bool Automation::eventFilter(QObject *obj, QEvent *event)
23772486
// {
23782487
// if (obj == pWeb) {

src/chrome/test/webdriver/webdriver_automation.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,25 @@ public slots:
7171
bool isCompleted;
7272
};
7373

74+
75+
class JSLogger : public QObject
76+
{
77+
Q_OBJECT
78+
79+
public:
80+
JSLogger();
81+
base::ListValue* getLog();
82+
83+
public slots:
84+
void log(QVariant message);
85+
void warn(QVariant message);
86+
void error(QVariant message);
87+
88+
private:
89+
InMemoryLog browserLog;
90+
Logger browserLogger;
91+
92+
};
7493
// Creates and controls the Chrome instance.
7594
// This class should be created and accessed on a single thread.
7695
// Note: All member functions are void because they are invoked
@@ -316,6 +335,13 @@ class Automation : public QObject {
316335
// set text into Prompt text field
317336
void SetAlertPromptText(const WebViewId& view_id, const std::string& text, Error **error);
318337

338+
// Gets browser (JavaScript console) logs
339+
void GetBrowserLog(base::ListValue **log);
340+
341+
// current view has been changed, reconnect signals
342+
void ResetBrowserCurrentView(const WebViewId& old_view_id, const WebViewId& new_view_id, Error **error);
343+
344+
319345

320346
// get native element size
321347
void GetNativeElementSize(const WebViewId& view_id,
@@ -420,8 +446,11 @@ class Automation : public QObject {
420446
QKeyEvent ConvertToQtKeyEvent(const WebKeyEvent &key_event);
421447
void BuildKeyMap();
422448
bool checkView(const WebViewId &view_id);
449+
void loadConsoleJS(const QWebView* view);
450+
void loadJSLogObject(QWebFrame *frame);
423451

424452
const Logger& logger_;
453+
JSLogger jslogger;
425454
// scoped_ptr<ProxyLauncher> launcher_;
426455
int build_no_;
427456
scoped_ptr<base::DictionaryValue> geolocation_;
@@ -436,6 +465,8 @@ class Automation : public QObject {
436465
private slots:
437466
void pageLoadStarted();
438467
void pageLoadFinished();
468+
void loadJSLogObject();
469+
void loadConsoleJS();
439470

440471
//protected:
441472
// bool eventFilter(QObject *obj, QEvent *ev);

src/chrome/test/webdriver/webdriver_logging.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ std::string LogLevelToString(LogLevel level) {
6767
bool LogType::FromString(const std::string& name, LogType* log_type) {
6868
if (name == "driver") {
6969
*log_type = LogType(kDriver);
70-
} else {
70+
} else if (name == "browser") {
71+
*log_type = LogType(kBrowser);
72+
} else{
7173
return false;
7274
}
7375
return true;
@@ -83,6 +85,8 @@ std::string LogType::ToString() const {
8385
switch (type_) {
8486
case kDriver:
8587
return "driver";
88+
case kBrowser:
89+
return "browser";
8690
default:
8791
return "unknown";
8892
};

src/chrome/test/webdriver/webdriver_logging.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class LogType {
4040
enum Type {
4141
kInvalid = -1,
4242
kDriver,
43+
kBrowser,
4344
kNum // must be correct
4445
};
4546

src/chrome/test/webdriver/webdriver_session.cc

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,16 @@ Error* Session::SwitchToView(const std::string& id_or_name) {
794794
if (!does_exist)
795795
return new Error(kNoSuchWindow);
796796
frame_elements_.clear();
797+
798+
RunSessionTask(base::Bind(
799+
&Automation::ResetBrowserCurrentView,
800+
base::Unretained(automation_.get()),
801+
current_target_.view_id,
802+
new_view,
803+
&error));
804+
if (error)
805+
return error;
806+
797807
current_target_ = FrameId(new_view, FramePath());
798808
return NULL;
799809
}
@@ -1788,10 +1798,22 @@ Error* Session::SetPreference(
17881798
return error;
17891799
}
17901800

1791-
base::ListValue* Session::GetLog() const {
1792-
base::ListValue* ret_val = session_log_->entries_list()->DeepCopy();
1793-
session_log_->clear_entries_list();
1794-
return ret_val;
1801+
base::ListValue* Session::GetLog(LogType::Type type) {
1802+
base::ListValue* ret_val;
1803+
if (type == LogType::kDriver)
1804+
{
1805+
ret_val = session_log_->entries_list()->DeepCopy();
1806+
session_log_->clear_entries_list();
1807+
return ret_val;
1808+
}
1809+
else
1810+
{
1811+
RunSessionTask(base::Bind(
1812+
&Automation::GetBrowserLog,
1813+
base::Unretained(automation_.get()),
1814+
&ret_val));
1815+
return ret_val;
1816+
}
17951817
}
17961818

17971819
Error* Session::GetBrowserConnectionState(bool* online) {
@@ -2200,7 +2222,7 @@ Error* Session::SwitchToFrameWithJavaScriptLocatedFrame(
22002222
std::string frame_id = GenerateRandomID();
22012223
error = ExecuteScriptAndParse(
22022224
current_target_,
2203-
"function(elem, id) { var meta; elem.setAttribute('wd_frame_id_', id); var doc = elem.contentDocument? elem.contentDocument: elem.contentWindow.document; meta=doc.createElement('meta'); meta.name = 'wd_frame_id_'; meta.content = id; var child = doc.body.appendChild(meta); console.log(meta); console.log(child);}",
2225+
"function(elem, id) { var meta; elem.setAttribute('wd_frame_id_', id); var doc = elem.contentDocument? elem.contentDocument: elem.contentWindow.document; meta=doc.createElement('meta'); meta.name = 'wd_frame_id_'; meta.content = id; var child = doc.body.appendChild(meta);}",
22042226
"setFrameId",
22052227
CreateListValueFrom(new_frame_element, frame_id),
22062228
CreateDirectValueParser(kSkipParsing));

src/chrome/test/webdriver/webdriver_session.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ class Session {
367367

368368
// Returns a copy of the current log entries. Caller is responsible for
369369
// returned value.
370-
base::ListValue* GetLog() const;
370+
base::ListValue* GetLog(LogType::Type type);
371371

372372
// Gets the browser connection state.
373373
Error* GetBrowserConnectionState(bool* online);

0 commit comments

Comments
 (0)