capybara-webkit 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +3 -3
- data/capybara-webkit.gemspec +1 -1
- data/lib/capybara/driver/webkit/node.rb +1 -4
- data/lib/capybara_webkit_builder.rb +3 -3
- data/spec/driver_spec.rb +62 -1
- data/spec/integration/driver_spec.rb +1 -3
- data/src/Command.h +2 -1
- data/src/Connection.cpp +36 -26
- data/src/Connection.h +5 -2
- data/src/Evaluate.cpp +1 -1
- data/src/Execute.cpp +2 -4
- data/src/Find.cpp +4 -5
- data/src/FrameFocus.cpp +3 -6
- data/src/Node.cpp +1 -1
- data/src/Reset.cpp +1 -2
- data/src/Response.cpp +19 -0
- data/src/Response.h +13 -0
- data/src/Source.cpp +2 -3
- data/src/Url.cpp +2 -3
- data/src/Visit.cpp +3 -3
- data/src/WebPage.cpp +10 -5
- data/src/capybara.js +53 -1
- data/src/webkit_server.pro +2 -2
- metadata +6 -4
data/Rakefile
CHANGED
@@ -6,17 +6,17 @@ require 'capybara_webkit_builder'
|
|
6
6
|
|
7
7
|
desc "Generate a Makefile using qmake"
|
8
8
|
file 'Makefile' do
|
9
|
-
CapybaraWebkitBuilder.makefile
|
9
|
+
CapybaraWebkitBuilder.makefile or exit(1)
|
10
10
|
end
|
11
11
|
|
12
12
|
desc "Regenerate dependencies using qmake"
|
13
13
|
task :qmake => 'Makefile' do
|
14
|
-
CapybaraWebkitBuilder.qmake
|
14
|
+
CapybaraWebkitBuilder.qmake or exit(1)
|
15
15
|
end
|
16
16
|
|
17
17
|
desc "Build the webkit server"
|
18
18
|
task :build => :qmake do
|
19
|
-
CapybaraWebkitBuilder.build
|
19
|
+
CapybaraWebkitBuilder.build or exit(1)
|
20
20
|
end
|
21
21
|
|
22
22
|
file 'bin/webkit_server' => :build
|
data/capybara-webkit.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "capybara-webkit"
|
3
|
-
s.version = "0.
|
3
|
+
s.version = "0.3.0"
|
4
4
|
s.authors = ["thoughtbot", "Joe Ferris", "Jason Morrison", "Tristan Dunn",
|
5
5
|
"Joshua Clayton", "Yuichi Tateno", "Aaron Gibralter"]
|
6
6
|
s.email = "support@thoughtbot.com"
|
@@ -42,9 +42,7 @@ class Capybara::Driver::Webkit
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def drag_to(element)
|
45
|
-
|
46
|
-
element.trigger('mousemove')
|
47
|
-
element.trigger('mouseup')
|
45
|
+
invoke 'dragTo', element.native
|
48
46
|
end
|
49
47
|
|
50
48
|
def tag_name
|
@@ -84,4 +82,3 @@ class Capybara::Driver::Webkit
|
|
84
82
|
end
|
85
83
|
end
|
86
84
|
end
|
87
|
-
|
@@ -12,7 +12,7 @@ module CapybaraWebkitBuilder
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def build
|
15
|
-
system("make")
|
15
|
+
system("make") or return false
|
16
16
|
|
17
17
|
FileUtils.mkdir("bin") unless File.directory?("bin")
|
18
18
|
|
@@ -24,8 +24,8 @@ module CapybaraWebkitBuilder
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def build_all
|
27
|
-
makefile
|
28
|
-
qmake
|
27
|
+
makefile &&
|
28
|
+
qmake &&
|
29
29
|
build
|
30
30
|
end
|
31
31
|
end
|
data/spec/driver_spec.rb
CHANGED
@@ -497,7 +497,7 @@ describe Capybara::Driver::Webkit do
|
|
497
497
|
|
498
498
|
draggable.drag_to(container)
|
499
499
|
|
500
|
-
subject.find("//*[@class='triggered']").size.should ==
|
500
|
+
subject.find("//*[@class='triggered']").size.should == 1
|
501
501
|
end
|
502
502
|
end
|
503
503
|
|
@@ -546,6 +546,67 @@ describe Capybara::Driver::Webkit do
|
|
546
546
|
end
|
547
547
|
end
|
548
548
|
|
549
|
+
context "error app" do
|
550
|
+
before(:all) do
|
551
|
+
@app = lambda do |env|
|
552
|
+
if env['PATH_INFO'] == "/error"
|
553
|
+
[404, {}, []]
|
554
|
+
else
|
555
|
+
body = <<-HTML
|
556
|
+
<html><body>
|
557
|
+
<form action="/error"><input type="submit"/></form>
|
558
|
+
</body></html>
|
559
|
+
HTML
|
560
|
+
[200,
|
561
|
+
{ 'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s },
|
562
|
+
[body]]
|
563
|
+
end
|
564
|
+
end
|
565
|
+
end
|
566
|
+
|
567
|
+
it "raises a webkit error for the requested url" do
|
568
|
+
expect {
|
569
|
+
subject.find("//input").first.click
|
570
|
+
wait_for_error_to_complete
|
571
|
+
subject.find("//body")
|
572
|
+
}.
|
573
|
+
to raise_error(Capybara::Driver::Webkit::WebkitError, %r{/error})
|
574
|
+
end
|
575
|
+
|
576
|
+
def wait_for_error_to_complete
|
577
|
+
sleep(0.5)
|
578
|
+
end
|
579
|
+
end
|
580
|
+
|
581
|
+
context "slow error app" do
|
582
|
+
before(:all) do
|
583
|
+
@app = lambda do |env|
|
584
|
+
if env['PATH_INFO'] == "/error"
|
585
|
+
body = "error"
|
586
|
+
sleep(1)
|
587
|
+
[304, {}, []]
|
588
|
+
else
|
589
|
+
body = <<-HTML
|
590
|
+
<html><body>
|
591
|
+
<form action="/error"><input type="submit"/></form>
|
592
|
+
<p>hello</p>
|
593
|
+
</body></html>
|
594
|
+
HTML
|
595
|
+
[200,
|
596
|
+
{ 'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s },
|
597
|
+
[body]]
|
598
|
+
end
|
599
|
+
end
|
600
|
+
end
|
601
|
+
|
602
|
+
it "raises a webkit error and then continues" do
|
603
|
+
subject.find("//input").first.click
|
604
|
+
expect { subject.find("//p") }.to raise_error(Capybara::Driver::Webkit::WebkitError)
|
605
|
+
subject.visit("/")
|
606
|
+
subject.find("//p").first.text.should == "hello"
|
607
|
+
end
|
608
|
+
end
|
609
|
+
|
549
610
|
context "popup app" do
|
550
611
|
before(:all) do
|
551
612
|
@app = lambda do |env|
|
@@ -9,9 +9,7 @@ describe Capybara::Driver::Webkit do
|
|
9
9
|
# TODO: select options
|
10
10
|
# it_should_behave_like "driver"
|
11
11
|
|
12
|
-
|
13
|
-
# it_should_behave_like "driver with javascript support"
|
14
|
-
|
12
|
+
it_should_behave_like "driver with javascript support"
|
15
13
|
it_should_behave_like "driver with cookies support"
|
16
14
|
|
17
15
|
# Can't support:
|
data/src/Command.h
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
#include <QObject>
|
5
5
|
#include <QStringList>
|
6
|
+
#include "Response.h"
|
6
7
|
|
7
8
|
class WebPage;
|
8
9
|
|
@@ -14,7 +15,7 @@ class Command : public QObject {
|
|
14
15
|
virtual void start(QStringList &arguments);
|
15
16
|
|
16
17
|
signals:
|
17
|
-
void finished(
|
18
|
+
void finished(Response *response);
|
18
19
|
|
19
20
|
protected:
|
20
21
|
WebPage *page();
|
data/src/Connection.cpp
CHANGED
@@ -20,7 +20,10 @@ Connection::Connection(QTcpSocket *socket, WebPage *page, QObject *parent) :
|
|
20
20
|
m_page = page;
|
21
21
|
m_command = NULL;
|
22
22
|
m_expectingDataSize = -1;
|
23
|
+
m_pageSuccess = true;
|
24
|
+
m_commandWaiting = false;
|
23
25
|
connect(m_socket, SIGNAL(readyRead()), this, SLOT(checkNext()));
|
26
|
+
connect(m_page, SIGNAL(loadFinished(bool)), this, SLOT(pendingLoadFinished(bool)));
|
24
27
|
}
|
25
28
|
|
26
29
|
void Connection::checkNext() {
|
@@ -75,25 +78,32 @@ void Connection::processArgument(const char *data) {
|
|
75
78
|
|
76
79
|
if (m_arguments.length() == m_argumentsExpected) {
|
77
80
|
if (m_page->isLoading())
|
78
|
-
|
81
|
+
m_commandWaiting = true;
|
79
82
|
else
|
80
83
|
startCommand();
|
81
84
|
}
|
82
85
|
}
|
83
86
|
|
84
87
|
void Connection::startCommand() {
|
85
|
-
|
86
|
-
if (
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
88
|
+
m_commandWaiting = false;
|
89
|
+
if (m_pageSuccess) {
|
90
|
+
m_command = createCommand(m_commandName.toAscii().constData());
|
91
|
+
if (m_command) {
|
92
|
+
connect(m_command,
|
93
|
+
SIGNAL(finished(Response *)),
|
94
|
+
this,
|
95
|
+
SLOT(finishCommand(Response *)));
|
96
|
+
m_command->start(m_arguments);
|
97
|
+
} else {
|
98
|
+
QString failure = QString("Unknown command: ") + m_commandName + "\n";
|
99
|
+
writeResponse(new Response(false, failure));
|
100
|
+
}
|
101
|
+
m_commandName = QString();
|
92
102
|
} else {
|
93
|
-
|
94
|
-
|
103
|
+
m_pageSuccess = true;
|
104
|
+
QString message = m_page->failureString();
|
105
|
+
writeResponse(new Response(false, message));
|
95
106
|
}
|
96
|
-
m_commandName = QString();
|
97
107
|
}
|
98
108
|
|
99
109
|
Command *Connection::createCommand(const char *name) {
|
@@ -102,31 +112,31 @@ Command *Connection::createCommand(const char *name) {
|
|
102
112
|
}
|
103
113
|
|
104
114
|
void Connection::pendingLoadFinished(bool success) {
|
105
|
-
|
106
|
-
if (
|
115
|
+
m_pageSuccess = success;
|
116
|
+
if (m_commandWaiting)
|
107
117
|
startCommand();
|
108
|
-
} else {
|
109
|
-
QString response = m_page->failureString();
|
110
|
-
finishCommand(false, response);
|
111
|
-
}
|
112
118
|
}
|
113
119
|
|
114
|
-
void Connection::finishCommand(
|
120
|
+
void Connection::finishCommand(Response *response) {
|
115
121
|
m_command->deleteLater();
|
116
122
|
m_command = NULL;
|
117
|
-
|
118
|
-
writeResponse(success, response);
|
123
|
+
writeResponse(response);
|
119
124
|
}
|
120
125
|
|
121
|
-
void Connection::writeResponse(
|
122
|
-
if (
|
126
|
+
void Connection::writeResponse(Response *response) {
|
127
|
+
if (response->isSuccess())
|
123
128
|
m_socket->write("ok\n");
|
124
129
|
else
|
125
130
|
m_socket->write("failure\n");
|
126
131
|
|
127
|
-
QByteArray
|
128
|
-
QString
|
129
|
-
m_socket->write(
|
130
|
-
m_socket->write(
|
132
|
+
QByteArray messageUtf8 = response->message().toUtf8();
|
133
|
+
QString messageLength = QString::number(messageUtf8.size()) + "\n";
|
134
|
+
m_socket->write(messageLength.toAscii());
|
135
|
+
m_socket->write(messageUtf8);
|
136
|
+
delete response;
|
137
|
+
|
138
|
+
m_arguments.clear();
|
139
|
+
m_commandName = QString();
|
140
|
+
m_argumentsExpected = -1;
|
131
141
|
}
|
132
142
|
|
data/src/Connection.h
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
class QTcpSocket;
|
5
5
|
class WebPage;
|
6
6
|
class Command;
|
7
|
+
class Response;
|
7
8
|
|
8
9
|
class Connection : public QObject {
|
9
10
|
Q_OBJECT
|
@@ -13,7 +14,7 @@ class Connection : public QObject {
|
|
13
14
|
|
14
15
|
public slots:
|
15
16
|
void checkNext();
|
16
|
-
void finishCommand(
|
17
|
+
void finishCommand(Response *response);
|
17
18
|
void pendingLoadFinished(bool success);
|
18
19
|
|
19
20
|
private:
|
@@ -23,7 +24,7 @@ class Connection : public QObject {
|
|
23
24
|
Command *createCommand(const char *name);
|
24
25
|
void processArgument(const char *line);
|
25
26
|
void startCommand();
|
26
|
-
void writeResponse(
|
27
|
+
void writeResponse(Response *response);
|
27
28
|
|
28
29
|
QTcpSocket *m_socket;
|
29
30
|
QString m_commandName;
|
@@ -32,5 +33,7 @@ class Connection : public QObject {
|
|
32
33
|
int m_argumentsExpected;
|
33
34
|
WebPage *m_page;
|
34
35
|
int m_expectingDataSize;
|
36
|
+
bool m_pageSuccess;
|
37
|
+
bool m_commandWaiting;
|
35
38
|
};
|
36
39
|
|
data/src/Evaluate.cpp
CHANGED
@@ -9,7 +9,7 @@ Evaluate::Evaluate(WebPage *page, QObject *parent) : Command(page, parent) {
|
|
9
9
|
void Evaluate::start(QStringList &arguments) {
|
10
10
|
QVariant result = page()->currentFrame()->evaluateJavaScript(arguments[0]);
|
11
11
|
addVariant(result);
|
12
|
-
emit finished(true, m_buffer);
|
12
|
+
emit finished(new Response(true, m_buffer));
|
13
13
|
}
|
14
14
|
|
15
15
|
void Evaluate::addVariant(QVariant &object) {
|
data/src/Execute.cpp
CHANGED
@@ -7,12 +7,10 @@ Execute::Execute(WebPage *page, QObject *parent) : Command(page, parent) {
|
|
7
7
|
void Execute::start(QStringList &arguments) {
|
8
8
|
QString script = arguments[0] + QString("; 'success'");
|
9
9
|
QVariant result = page()->currentFrame()->evaluateJavaScript(script);
|
10
|
-
QString response;
|
11
10
|
if (result.isValid()) {
|
12
|
-
emit finished(true
|
11
|
+
emit finished(new Response(true));
|
13
12
|
} else {
|
14
|
-
|
15
|
-
emit finished(false, response);
|
13
|
+
emit finished(new Response(false, "Javascript failed to execute"));
|
16
14
|
}
|
17
15
|
}
|
18
16
|
|
data/src/Find.cpp
CHANGED
@@ -6,15 +6,14 @@ Find::Find(WebPage *page, QObject *parent) : Command(page, parent) {
|
|
6
6
|
}
|
7
7
|
|
8
8
|
void Find::start(QStringList &arguments) {
|
9
|
-
QString
|
9
|
+
QString message;
|
10
10
|
QVariant result = page()->invokeCapybaraFunction("find", arguments);
|
11
11
|
|
12
12
|
if (result.isValid()) {
|
13
|
-
|
14
|
-
emit finished(true,
|
13
|
+
message = result.toString();
|
14
|
+
emit finished(new Response(true, message));
|
15
15
|
} else {
|
16
|
-
|
17
|
-
emit finished(false, response);
|
16
|
+
emit finished(new Response(false, "Invalid XPath expression"));
|
18
17
|
}
|
19
18
|
}
|
20
19
|
|
data/src/FrameFocus.cpp
CHANGED
@@ -50,8 +50,7 @@ void FrameFocus::focusId(QString name) {
|
|
50
50
|
|
51
51
|
void FrameFocus::focusParent() {
|
52
52
|
if (page()->currentFrame()->parentFrame() == 0) {
|
53
|
-
|
54
|
-
emit finished(false, response);
|
53
|
+
emit finished(new Response(false, "Already at parent frame."));
|
55
54
|
} else {
|
56
55
|
page()->currentFrame()->parentFrame()->setFocus();
|
57
56
|
success();
|
@@ -59,11 +58,9 @@ void FrameFocus::focusParent() {
|
|
59
58
|
}
|
60
59
|
|
61
60
|
void FrameFocus::frameNotFound() {
|
62
|
-
|
63
|
-
emit finished(false, response);
|
61
|
+
emit finished(new Response(false, "Unable to locate frame. "));
|
64
62
|
}
|
65
63
|
|
66
64
|
void FrameFocus::success() {
|
67
|
-
|
68
|
-
emit finished(true, response);
|
65
|
+
emit finished(new Response(true));
|
69
66
|
}
|
data/src/Node.cpp
CHANGED
@@ -9,6 +9,6 @@ void Node::start(QStringList &arguments) {
|
|
9
9
|
QString functionName = functionArguments.takeFirst();
|
10
10
|
QVariant result = page()->invokeCapybaraFunction(functionName, functionArguments);
|
11
11
|
QString attributeValue = result.toString();
|
12
|
-
emit finished(true, attributeValue);
|
12
|
+
emit finished(new Response(true, attributeValue));
|
13
13
|
}
|
14
14
|
|
data/src/Reset.cpp
CHANGED
@@ -10,7 +10,6 @@ void Reset::start(QStringList &arguments) {
|
|
10
10
|
page()->triggerAction(QWebPage::Stop);
|
11
11
|
page()->currentFrame()->setHtml("<html><body></body></html>");
|
12
12
|
page()->networkAccessManager()->setCookieJar(new QNetworkCookieJar());
|
13
|
-
|
14
|
-
emit finished(true, response);
|
13
|
+
emit finished(new Response(true));
|
15
14
|
}
|
16
15
|
|
data/src/Response.cpp
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#include "Response.h"
|
2
|
+
#include <iostream>
|
3
|
+
|
4
|
+
Response::Response(bool success, QString message) {
|
5
|
+
m_success = success;
|
6
|
+
m_message = message;
|
7
|
+
}
|
8
|
+
|
9
|
+
Response::Response(bool success) {
|
10
|
+
m_success = success;
|
11
|
+
}
|
12
|
+
|
13
|
+
bool Response::isSuccess() const {
|
14
|
+
return m_success;
|
15
|
+
}
|
16
|
+
|
17
|
+
QString Response::message() const {
|
18
|
+
return m_message;
|
19
|
+
}
|
data/src/Response.h
ADDED
data/src/Source.cpp
CHANGED
@@ -7,8 +7,7 @@ Source::Source(WebPage *page, QObject *parent) : Command(page, parent) {
|
|
7
7
|
void Source::start(QStringList &arguments) {
|
8
8
|
Q_UNUSED(arguments)
|
9
9
|
|
10
|
-
QString
|
11
|
-
|
12
|
-
emit finished(true, response);
|
10
|
+
QString result = page()->currentFrame()->toHtml();
|
11
|
+
emit finished(new Response(true, result));
|
13
12
|
}
|
14
13
|
|
data/src/Url.cpp
CHANGED
@@ -9,8 +9,7 @@ void Url::start(QStringList &argments) {
|
|
9
9
|
|
10
10
|
QUrl humanUrl = page()->currentFrame()->url();
|
11
11
|
QByteArray encodedBytes = humanUrl.toEncoded();
|
12
|
-
QString
|
13
|
-
|
14
|
-
emit finished(true, response);
|
12
|
+
QString urlString = QString(encodedBytes);
|
13
|
+
emit finished(new Response(true, urlString));
|
15
14
|
}
|
16
15
|
|
data/src/Visit.cpp
CHANGED
@@ -11,10 +11,10 @@ void Visit::start(QStringList &arguments) {
|
|
11
11
|
}
|
12
12
|
|
13
13
|
void Visit::loadFinished(bool success) {
|
14
|
-
QString
|
14
|
+
QString message;
|
15
15
|
if (!success)
|
16
|
-
|
16
|
+
message = page()->failureString();
|
17
17
|
|
18
|
-
emit finished(success,
|
18
|
+
emit finished(new Response(success, message));
|
19
19
|
}
|
20
20
|
|
data/src/WebPage.cpp
CHANGED
@@ -5,10 +5,15 @@
|
|
5
5
|
|
6
6
|
WebPage::WebPage(QObject *parent) : QWebPage(parent) {
|
7
7
|
QResource javascript(":/capybara.js");
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
if (javascript.isCompressed()) {
|
9
|
+
QByteArray uncompressedBytes(qUncompress(javascript.data(), javascript.size()));
|
10
|
+
m_capybaraJavascript = QString(uncompressedBytes);
|
11
|
+
} else {
|
12
|
+
char * javascriptString = new char[javascript.size() + 1];
|
13
|
+
strcpy(javascriptString, (const char *)javascript.data());
|
14
|
+
javascriptString[javascript.size()] = 0;
|
15
|
+
m_capybaraJavascript = javascriptString;
|
16
|
+
}
|
12
17
|
m_loading = false;
|
13
18
|
connect(this, SIGNAL(loadStarted()), this, SLOT(loadStarted()));
|
14
19
|
connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool)));
|
@@ -82,6 +87,6 @@ bool WebPage::isLoading() const {
|
|
82
87
|
}
|
83
88
|
|
84
89
|
QString WebPage::failureString() {
|
85
|
-
return QString("Unable to load URL: ") + currentFrame()->
|
90
|
+
return QString("Unable to load URL: ") + currentFrame()->requestedUrl().toString();
|
86
91
|
}
|
87
92
|
|
data/src/capybara.js
CHANGED
@@ -92,7 +92,59 @@ Capybara = {
|
|
92
92
|
|
93
93
|
unselectOption: function(index) {
|
94
94
|
this.nodes[index].removeAttribute("selected");
|
95
|
-
}
|
95
|
+
},
|
96
96
|
|
97
|
+
centerPostion: function(element) {
|
98
|
+
this.reflow(element);
|
99
|
+
var rect = element.getBoundingClientRect();
|
100
|
+
var position = {
|
101
|
+
x: rect.width / 2,
|
102
|
+
y: rect.height / 2
|
103
|
+
};
|
104
|
+
do {
|
105
|
+
position.x += element.offsetLeft;
|
106
|
+
position.y += element.offsetTop;
|
107
|
+
} while ((element = element.offsetParent));
|
108
|
+
position.x = Math.floor(position.x), position.y = Math.floor(position.y);
|
109
|
+
|
110
|
+
return position;
|
111
|
+
},
|
112
|
+
|
113
|
+
reflow: function(element, force) {
|
114
|
+
if (force || element.offsetWidth === 0) {
|
115
|
+
var prop, oldStyle = {}, newStyle = {position: "absolute", visibility : "hidden", display: "block" };
|
116
|
+
for (prop in newStyle) {
|
117
|
+
oldStyle[prop] = element.style[prop];
|
118
|
+
element.style[prop] = newStyle[prop];
|
119
|
+
}
|
120
|
+
element.offsetWidth, element.offsetHeight; // force reflow
|
121
|
+
for (prop in oldStyle)
|
122
|
+
element.style[prop] = oldStyle[prop];
|
123
|
+
}
|
124
|
+
},
|
125
|
+
|
126
|
+
dragTo: function (index, targetIndex) {
|
127
|
+
var element = this.nodes[index], target = this.nodes[targetIndex];
|
128
|
+
var position = this.centerPostion(element);
|
129
|
+
var options = {
|
130
|
+
clientX: position.x,
|
131
|
+
clientY: position.y
|
132
|
+
};
|
133
|
+
var mouseTrigger = function(eventName, options) {
|
134
|
+
var eventObject = document.createEvent("MouseEvents");
|
135
|
+
eventObject.initMouseEvent(eventName, true, true, window, 0, 0, 0, options.clientX || 0, options.clientY || 0, false, false, false, false, 0, null);
|
136
|
+
element.dispatchEvent(eventObject);
|
137
|
+
}
|
138
|
+
mouseTrigger('mousedown', options);
|
139
|
+
options.clientX += 1, options.clientY += 1;
|
140
|
+
mouseTrigger('mousemove', options);
|
141
|
+
|
142
|
+
position = this.centerPostion(target), options = {
|
143
|
+
clientX: position.x,
|
144
|
+
clientY: position.y
|
145
|
+
};
|
146
|
+
mouseTrigger('mousemove', options);
|
147
|
+
mouseTrigger('mouseup', options);
|
148
|
+
}
|
97
149
|
};
|
98
150
|
|
data/src/webkit_server.pro
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
TEMPLATE = app
|
2
2
|
TARGET = webkit_server
|
3
3
|
DESTDIR = .
|
4
|
-
HEADERS = WebPage.h Server.h Connection.h Command.h Visit.h Find.h Reset.h Node.h JavascriptInvocation.h Url.h Source.h Evaluate.h Execute.h FrameFocus.h
|
5
|
-
SOURCES = main.cpp WebPage.cpp Server.cpp Connection.cpp Command.cpp Visit.cpp Find.cpp Reset.cpp Node.cpp JavascriptInvocation.cpp Url.cpp Source.cpp Evaluate.cpp Execute.cpp FrameFocus.cpp
|
4
|
+
HEADERS = WebPage.h Server.h Connection.h Command.h Visit.h Find.h Reset.h Node.h JavascriptInvocation.h Url.h Source.h Evaluate.h Execute.h FrameFocus.h Response.h
|
5
|
+
SOURCES = main.cpp WebPage.cpp Server.cpp Connection.cpp Command.cpp Visit.cpp Find.cpp Reset.cpp Node.cpp JavascriptInvocation.cpp Url.cpp Source.cpp Evaluate.cpp Execute.cpp FrameFocus.cpp Response.cpp
|
6
6
|
RESOURCES = webkit_server.qrc
|
7
7
|
QT += network webkit
|
8
8
|
CONFIG += console
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-webkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- thoughtbot
|
@@ -21,7 +21,7 @@ autorequire:
|
|
21
21
|
bindir: bin
|
22
22
|
cert_chain: []
|
23
23
|
|
24
|
-
date: 2011-
|
24
|
+
date: 2011-05-05 00:00:00 -04:00
|
25
25
|
default_executable:
|
26
26
|
dependencies:
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -86,6 +86,8 @@ files:
|
|
86
86
|
- src/Node.h
|
87
87
|
- src/Reset.cpp
|
88
88
|
- src/Reset.h
|
89
|
+
- src/Response.cpp
|
90
|
+
- src/Response.h
|
89
91
|
- src/Server.cpp
|
90
92
|
- src/Server.h
|
91
93
|
- src/Source.cpp
|