Skip to content

Commit 9246a1e

Browse files
committed
Merge branch 'WD_1.X_dev' of https://portal-ua.globallogic.com/git/wd into WD_1.X_dev
2 parents 26edcf0 + 1eb1dc6 commit 9246a1e

File tree

7 files changed

+199
-49
lines changed

7 files changed

+199
-49
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#include "WindowWithDeclarativeViewTest.h"
2+
3+
WindowWithDeclarativeViewTestWidget::WindowWithDeclarativeViewTestWidget(QWidget *parent) :
4+
QWidget(parent)
5+
{
6+
setWindowTitle("Test Window");
7+
pLineEdit = new QLineEdit();
8+
pLineEdit->setObjectName("inputURL");
9+
connect(pLineEdit, SIGNAL(returnPressed()), this, SLOT(loadQML()));
10+
11+
pButton = new QPushButton("Go!");
12+
pButton->setObjectName("loadButton");
13+
connect(pButton, SIGNAL(clicked()), this, SLOT(loadQML()));
14+
15+
pLabel = new QLabel("Status");
16+
pLabel->setObjectName("labelStatus");
17+
pLabel->setVisible(true);
18+
19+
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
20+
pView = new QQuickView();
21+
#else
22+
pView = new QDeclarativeView();
23+
#endif
24+
25+
pView->setObjectName("declarativeView");
26+
27+
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
28+
connect(pView, SIGNAL(statusChanged(QQuickView::Status)), this, SLOT(displayStatus()));
29+
#else
30+
connect(pView, SIGNAL(statusChanged(QDeclarativeView::Status)), this, SLOT(displayStatus()));
31+
#endif
32+
33+
QHBoxLayout* hbl = new QHBoxLayout();
34+
hbl->addWidget(pLineEdit);
35+
hbl->addWidget(pButton);
36+
37+
QVBoxLayout *vbl = new QVBoxLayout(this);
38+
vbl->addLayout(hbl);
39+
vbl->addWidget(pLabel);
40+
vbl->addWidget(pView);
41+
this->setLayout(vbl);
42+
}
43+
44+
WindowWithDeclarativeViewTestWidget::~WindowWithDeclarativeViewTestWidget() { }
45+
46+
void WindowWithDeclarativeViewTestWidget::loadQML() {
47+
pView->setSource(QUrl(pLineEdit->text()));
48+
pView->show();
49+
}
50+
51+
void WindowWithDeclarativeViewTestWidget::displayStatus() {
52+
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
53+
if (pView->status() == QQuickView::Ready)
54+
#else
55+
if (pView->status() == QDeclarativeView::Ready)
56+
#endif
57+
pLabel->setText("Loading successfully");
58+
59+
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
60+
if (pView->status() == QQuickView::Error)
61+
#else
62+
if (pView->status() == QDeclarativeView::Error)
63+
#endif
64+
pLabel->setText("Error");
65+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#ifndef WINDOWWITHDECLARATIVEVIEWTEST_H
2+
#define WINDOWWITHDECLARATIVEVIEWTEST_H
3+
4+
#include "CommonQtTestHeaders.h"
5+
6+
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
7+
#include <QtQuick/QQuickView>
8+
#else
9+
#include <QtDeclarative/QDeclarativeView>
10+
#endif
11+
12+
13+
class WindowWithDeclarativeViewTestWidget : public QWidget
14+
{
15+
Q_OBJECT
16+
public:
17+
explicit WindowWithDeclarativeViewTestWidget(QWidget *parent = 0);
18+
~WindowWithDeclarativeViewTestWidget();
19+
20+
public slots:
21+
void loadQML();
22+
void displayStatus();
23+
24+
private:
25+
QPushButton* pButton;
26+
QLineEdit* pLineEdit;
27+
QLabel *pLabel;
28+
29+
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
30+
QQuickView *pView;
31+
#else
32+
QDeclarativeView *pView;
33+
#endif
34+
35+
};
36+
37+
#endif // WINDOWWITHDECLARATIVEVIEWTEST_H

src/Test/main.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ std::string tests::testDataFolder;
3636
#include "VisibilityTest.h"
3737
#include "BasicMouseInterfaceTest.h"
3838

39+
#include "WindowWithDeclarativeViewTest.h"
40+
3941
// Commented VideoTest due to error https://bugreports.qt-project.org/browse/QTBUG-32949
4042
#ifndef OS_IOS
4143
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
@@ -130,6 +132,7 @@ int main(int argc, char *argv[])
130132
widgetCreator->RegisterViewClass<StaleElementReferenceTestWidget>("StaleElementReferenceTestWidget");
131133
widgetCreator->RegisterViewClass<VisibilityTestWidget>("VisibilityTestWidget");
132134
widgetCreator->RegisterViewClass<BasicMouseInterfaceTestWidget>("BasicMouseInterfaceTestWidget");
135+
widgetCreator->RegisterViewClass<WindowWithDeclarativeViewTestWidget>("WindowWithDeclarativeViewTestWidget");
133136

134137
#ifndef OS_IOS
135138
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
@@ -245,7 +248,6 @@ int main(int argc, char *argv[])
245248
return startError;
246249

247250
setQtSettings();
248-
249251
return app.exec();
250252
}
251253

src/webdriver/extension_qt/qwebkit_proxy.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,9 +1165,8 @@ Error* QWebkitProxy::ExecuteScriptAndParse(QWebFrame* frame,
11651165
}
11661166

11671167
scoped_ptr<Value> value(unscoped_value);
1168-
std::string error_msg;
11691168
if (!parser->Parse(value.get())) {
1170-
error_msg = base::StringPrintf("%s returned invalid value: %s",
1169+
std::string error_msg = base::StringPrintf("%s returned invalid value: %s",
11711170
script_name.c_str(), JsonStringify(value.get()).c_str());
11721171
return new Error(kUnknownError, error_msg);
11731172
}

src/webdriver/extension_qt/web_view_visualizer.cc

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,38 +19,53 @@ QWebViewVisualizerSourceCommand::QWebViewVisualizerSourceCommand(QWebViewCmdExec
1919
void QWebViewVisualizerSourceCommand::Execute(std::string* source, Error** error) {
2020
// Convert DOM tree to valid XML.
2121
const char* kSource =
22-
"function() {\n"
23-
" var elements = document.getElementsByTagName('*');\n"
24-
" for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) {\n"
25-
" var element = elements[elementIndex];\n"
26-
" if (element.tagName.toLowerCase() == 'script')\n"
27-
" element.innerHTML = '';\n"
28-
" if (element.hasAttribute('\"'))\n"
29-
" element.removeAttribute('\"');\n"
22+
"var root = document.documentElement.cloneNode(true);\n"
23+
"var elements = root.getElementsByTagName('*');\n"
24+
"for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) {\n"
25+
" var element = elements[elementIndex];\n"
26+
" if (element.tagName.toLowerCase() == 'script')\n"
27+
" element.innerHTML = '';\n"
28+
" if (element.hasAttribute('\"'))\n"
29+
" element.removeAttribute('\"');\n"
3030
"\n"
31-
" var childNodes = element.childNodes;\n"
32-
" for (var childIndex = 0; childIndex < childNodes.length; childIndex++) {\n"
33-
" var child = childNodes[childIndex];\n"
34-
" if (child.nodeType == Node.TEXT_NODE) {\n"
35-
" child.nodeValue = child.nodeValue.replace(/&/g, '&amp;');\n"
36-
" }\n"
31+
" var childNodes = element.childNodes;\n"
32+
" for (var childIndex = 0; childIndex < childNodes.length; childIndex++) {\n"
33+
" var child = childNodes[childIndex];\n"
34+
" if (child.nodeType == Node.TEXT_NODE) {\n"
35+
" child.nodeValue = child.nodeValue.replace(/&/g, '&amp;');\n"
3736
" }\n"
3837
" }\n"
38+
"}\n"
3939
"\n"
40-
" var xhtml = document.implementation.createDocument();\n"
41-
" xhtml = xhtml.importNode(document.documentElement, true);\n"
42-
"\n"
43-
" return new XMLSerializer().serializeToString(xhtml);\n"
44-
"}";
45-
46-
// TODO: use executor->webkitProxy->ExecuteScript()
47-
/* *error = executor_->ExecuteScriptAndParse(
48-
executor_->GetFrame(view_, session_->current_frame()),
40+
"var xhtml = document.implementation.createDocument();\n"
41+
"var dt = '';\n"
42+
"if (document.childNodes[0].nodeType == Node.DOCUMENT_TYPE_NODE) {\n"
43+
" dt = document.childNodes[0];\n"
44+
" dt = new XMLSerializer().serializeToString(dt);\n"
45+
"}\n"
46+
"xhtml = xhtml.importNode(root, true);\n"
47+
"xhtml = new XMLSerializer().serializeToString(xhtml);\n"
48+
"return dt + xhtml;";
49+
50+
Value* unscoped_value = NULL;
51+
executor_->ExecuteScript(
4952
kSource,
50-
"getSource",
5153
new ListValue(),
52-
CreateDirectValueParser(source));
53-
*/
54+
&unscoped_value,
55+
error);
56+
if (*error) {
57+
(*error)->AddDetails("getSource execution failed");
58+
return;
59+
}
60+
61+
scoped_ptr<Value> value(unscoped_value);
62+
const ValueParser* parser = CreateDirectValueParser(source);
63+
if (!parser->Parse(value.get())) {
64+
std::string error_msg = base::StringPrintf("getSource returned invalid value: %s",
65+
JsonStringify(value.get()).c_str());
66+
*error = new Error(kUnknownError, error_msg);
67+
return;
68+
}
5469

5570
session_->logger().Log(kInfoLogLevel, "[QWebViewVisualizerSourceCommand] before transform:");
5671
session_->logger().Log(kInfoLogLevel, *source);

wd_test.gyp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,9 @@
238238
'src/Test/RestyledLabel.cc',
239239
'src/Test/DragableWidget.cc',
240240
'src/Test/BasicMouseInterfaceTest.cc',
241+
'src/Test/WindowWithDeclarativeViewTest.cc',
242+
'src/Test/WindowWithDeclarativeViewTest.h',
243+
'<(INTERMEDIATE_DIR)/moc_WindowWithDeclarativeViewTest.cc',
241244
],
242245
'conditions': [
243246
# IGNORE VideoTest due to error https://bugreports.qt-project.org/browse/QTBUG-32949

web/WebDriverJsDemo.html

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,39 @@
4242
}
4343
}
4444

45+
function getXPath(node, path) {
46+
path = path || [];
47+
if(node.parentNode) {
48+
path = getXPath(node.parentNode, path);
49+
}
50+
51+
if(node.previousSibling) {
52+
var count = 1;
53+
var sibling = node.previousSibling
54+
do {
55+
if(sibling.nodeType == 1 && sibling.nodeName == node.nodeName) {count++;}
56+
sibling = sibling.previousSibling;
57+
} while(sibling);
58+
if(count == 1) {count = null;}
59+
} else if(node.nextSibling) {
60+
var sibling = node.nextSibling;
61+
do {
62+
if(sibling.nodeType == 1 && sibling.nodeName == node.nodeName) {
63+
var count = 1;
64+
sibling = null;
65+
} else {
66+
var count = null;
67+
sibling = sibling.previousSibling;
68+
}
69+
} while(sibling);
70+
}
71+
72+
if(node.nodeType == 1) {
73+
path.push(node.nodeName.toLowerCase() + (node.id ? "[@id='"+node.id+"']" : count > 0 ? "["+count+"]" : ''));
74+
}
75+
return path;
76+
}
77+
4578
webdriver.WebDriver.prototype.visualizerGetSource = function() {
4679
webdriver.http.Executor.COMMAND_MAP_['visualizerGetSource'] = {
4780
method: 'GET', path: '/session/:sessionId/-cisco-visualizer_source'};
@@ -256,17 +289,18 @@
256289
}
257290

258291
WebDriverJsDemo.prototype.visualizerAssignEventHandlers = function() {
292+
var self = this;
259293
var win = this.visualizationWin;
260294

261295
win.document.onkeypress = function(event) {
262296
var key = String.fromCharCode(event.charCode);
263297

264298
if (event.target.hasAttribute('elementId')) {
265299
var elementId = event.target.getAttribute('elementId');
266-
var element = new webdriver.WebElement(wd.driver, elementId);
300+
var element = new webdriver.WebElement(self.driver, elementId);
267301
element.sendKeys(key);
268302
} else {
269-
wd.driver.actions().sendKeys(key).perform();
303+
self.driver.actions().sendKeys(key).perform();
270304
}
271305

272306
return true;
@@ -279,10 +313,10 @@
279313

280314
if (event.target.hasAttribute('elementId')) {
281315
var elementId = event.target.getAttribute('elementId');
282-
var element = new webdriver.WebElement(wd.driver, elementId);
316+
var element = new webdriver.WebElement(self.driver, elementId);
283317
element.sendKeys(key);
284318
} else {
285-
wd.driver.actions().sendKeys(key).perform();
319+
self.driver.actions().sendKeys(key).perform();
286320
}
287321

288322
return true;
@@ -291,27 +325,22 @@
291325
win.document.onclick = function(event) {
292326
if (event.target.hasAttribute('elementId')) {
293327
var elementId = event.target.getAttribute('elementId');
294-
var element = new webdriver.WebElement(wd.driver, elementId);
328+
var element = new webdriver.WebElement(self.driver, elementId);
295329
element.click();
296330
return false;
297331
}
298332

299-
//wd.driver.findElement(event.target).click();
300-
//wd.driver.actions().click(event.target).perform();
301-
var hostSize = {width: win.innerWidth, height: win.innerHeight};
302-
303-
wd.driver.manage().window().getSize().then(function(targetSize) {
304-
var targetDoc = wd.driver.findElement(webdriver.By.xpath('/html'));
305-
var x = Math.floor(event.clientX * targetSize.width / hostSize.width);
306-
var y = Math.floor(event.clientY * targetSize.height / hostSize.height);
307-
return wd.driver.actions().
308-
mouseMove(targetDoc, {x: x, y: y}).
309-
click(event.button).
310-
perform();
311-
}).then(function() {
312-
return wd.driver.visualizerShowPoint();
333+
var xpath = getXPath(event.target);
334+
xpath = '/' + xpath.join('/');
335+
var target = self.driver.findElement(webdriver.By.xpath(xpath));
336+
self.driver.actions().
337+
mouseMove(target, {x: event.offsetX, y: event.offsetY}).
338+
click(event.button).
339+
perform().
340+
then(function() {
341+
return self.driver.visualizerShowPoint();
313342
}).then(function() {
314-
// wd.updateSource();
343+
// self.updateSource();
315344
});
316345

317346
return false;

0 commit comments

Comments
 (0)