capybara-webkit 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/.gitignore +3 -1
  2. data/Gemfile.lock +5 -4
  3. data/NEWS.md +11 -0
  4. data/README.md +42 -0
  5. data/lib/capybara/driver/webkit.rb +7 -2
  6. data/lib/capybara/driver/webkit/browser.rb +22 -96
  7. data/lib/capybara/driver/webkit/connection.rb +120 -0
  8. data/lib/capybara/driver/webkit/version.rb +1 -1
  9. data/lib/capybara/webkit/matchers.rb +2 -4
  10. data/lib/capybara_webkit_builder.rb +22 -4
  11. data/spec/browser_spec.rb +19 -29
  12. data/spec/connection_spec.rb +54 -0
  13. data/spec/driver_resize_window_spec.rb +59 -0
  14. data/spec/driver_spec.rb +175 -27
  15. data/spec/spec_helper.rb +9 -2
  16. data/src/Body.h +2 -2
  17. data/src/ClearCookies.cpp +2 -5
  18. data/src/ClearCookies.h +2 -2
  19. data/src/Command.cpp +7 -3
  20. data/src/Command.h +4 -2
  21. data/src/CommandFactory.cpp +7 -2
  22. data/src/CommandFactory.h +1 -1
  23. data/src/CommandParser.cpp +13 -5
  24. data/src/CommandParser.h +6 -2
  25. data/src/Connection.cpp +18 -47
  26. data/src/Connection.h +5 -7
  27. data/src/ConsoleMessages.cpp +2 -3
  28. data/src/ConsoleMessages.h +2 -2
  29. data/src/CurrentUrl.cpp +3 -6
  30. data/src/CurrentUrl.h +2 -2
  31. data/src/Evaluate.cpp +3 -3
  32. data/src/Evaluate.h +2 -2
  33. data/src/Execute.cpp +4 -4
  34. data/src/Execute.h +2 -2
  35. data/src/Find.cpp +4 -4
  36. data/src/Find.h +2 -2
  37. data/src/FrameFocus.cpp +7 -7
  38. data/src/FrameFocus.h +2 -2
  39. data/src/GetCookies.cpp +2 -4
  40. data/src/GetCookies.h +2 -2
  41. data/src/Header.cpp +4 -4
  42. data/src/Header.h +2 -2
  43. data/src/Headers.cpp +2 -3
  44. data/src/Headers.h +2 -2
  45. data/src/IgnoreSslErrors.cpp +12 -0
  46. data/src/IgnoreSslErrors.h +12 -0
  47. data/src/NetworkAccessManager.cpp +4 -0
  48. data/src/NetworkAccessManager.h +2 -1
  49. data/src/Node.cpp +3 -3
  50. data/src/Node.h +2 -2
  51. data/src/NullCommand.cpp +10 -0
  52. data/src/NullCommand.h +11 -0
  53. data/src/PageLoadingCommand.cpp +46 -0
  54. data/src/PageLoadingCommand.h +40 -0
  55. data/src/Render.cpp +5 -6
  56. data/src/Render.h +2 -2
  57. data/src/RequestedUrl.cpp +3 -6
  58. data/src/RequestedUrl.h +2 -2
  59. data/src/Reset.cpp +8 -7
  60. data/src/Reset.h +2 -2
  61. data/src/ResizeWindow.cpp +16 -0
  62. data/src/ResizeWindow.h +12 -0
  63. data/src/Response.cpp +6 -1
  64. data/src/Response.h +4 -2
  65. data/src/Server.cpp +2 -3
  66. data/src/Server.h +1 -1
  67. data/src/SetCookie.cpp +3 -5
  68. data/src/SetCookie.h +2 -2
  69. data/src/SetProxy.cpp +7 -9
  70. data/src/SetProxy.h +2 -2
  71. data/src/Source.cpp +2 -4
  72. data/src/Source.h +2 -2
  73. data/src/Status.cpp +2 -3
  74. data/src/Status.h +2 -2
  75. data/src/Url.cpp +3 -6
  76. data/src/Url.h +2 -2
  77. data/src/Visit.cpp +4 -13
  78. data/src/Visit.h +2 -5
  79. data/src/WebPage.cpp +11 -9
  80. data/src/WebPage.h +3 -3
  81. data/src/body.cpp +2 -3
  82. data/src/capybara.js +58 -3
  83. data/src/find_command.h +3 -1
  84. data/src/main.cpp +1 -2
  85. data/src/webkit_server.pro +8 -0
  86. metadata +29 -16
data/src/Evaluate.h CHANGED
@@ -8,8 +8,8 @@ class Evaluate : public Command {
8
8
  Q_OBJECT
9
9
 
10
10
  public:
11
- Evaluate(WebPage *page, QObject *parent = 0);
12
- virtual void start(QStringList &arguments);
11
+ Evaluate(WebPage *page, QStringList &arguments, QObject *parent = 0);
12
+ virtual void start();
13
13
 
14
14
  private:
15
15
  void addVariant(QVariant &object);
data/src/Execute.cpp CHANGED
@@ -1,16 +1,16 @@
1
1
  #include "Execute.h"
2
2
  #include "WebPage.h"
3
3
 
4
- Execute::Execute(WebPage *page, QObject *parent) : Command(page, parent) {
4
+ Execute::Execute(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {
5
5
  }
6
6
 
7
- void Execute::start(QStringList &arguments) {
8
- QString script = arguments[0] + QString("; 'success'");
7
+ void Execute::start() {
8
+ QString script = arguments()[0] + QString("; 'success'");
9
9
  QVariant result = page()->currentFrame()->evaluateJavaScript(script);
10
10
  if (result.isValid()) {
11
11
  emit finished(new Response(true));
12
12
  } else {
13
- emit finished(new Response(false, "Javascript failed to execute"));
13
+ emit finished(new Response(false, QString("Javascript failed to execute")));
14
14
  }
15
15
  }
16
16
 
data/src/Execute.h CHANGED
@@ -6,7 +6,7 @@ class Execute : public Command {
6
6
  Q_OBJECT
7
7
 
8
8
  public:
9
- Execute(WebPage *page, QObject *parent = 0);
10
- virtual void start(QStringList &arguments);
9
+ Execute(WebPage *page, QStringList &arguments, QObject *parent = 0);
10
+ virtual void start();
11
11
  };
12
12
 
data/src/Find.cpp CHANGED
@@ -2,18 +2,18 @@
2
2
  #include "Command.h"
3
3
  #include "WebPage.h"
4
4
 
5
- Find::Find(WebPage *page, QObject *parent) : Command(page, parent) {
5
+ Find::Find(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {
6
6
  }
7
7
 
8
- void Find::start(QStringList &arguments) {
8
+ void Find::start() {
9
9
  QString message;
10
- QVariant result = page()->invokeCapybaraFunction("find", arguments);
10
+ QVariant result = page()->invokeCapybaraFunction("find", arguments());
11
11
 
12
12
  if (result.isValid()) {
13
13
  message = result.toString();
14
14
  emit finished(new Response(true, message));
15
15
  } else {
16
- emit finished(new Response(false, "Invalid XPath expression"));
16
+ emit finished(new Response(false, QString("Invalid XPath expression")));
17
17
  }
18
18
  }
19
19
 
data/src/Find.h CHANGED
@@ -6,8 +6,8 @@ class Find : public Command {
6
6
  Q_OBJECT
7
7
 
8
8
  public:
9
- Find(WebPage *page, QObject *parent = 0);
10
- virtual void start(QStringList &arguments);
9
+ Find(WebPage *page, QStringList &arguments, QObject *parent = 0);
10
+ virtual void start();
11
11
  };
12
12
 
13
13
 
data/src/FrameFocus.cpp CHANGED
@@ -2,17 +2,17 @@
2
2
  #include "Command.h"
3
3
  #include "WebPage.h"
4
4
 
5
- FrameFocus::FrameFocus(WebPage *page, QObject *parent) : Command(page, parent) {
5
+ FrameFocus::FrameFocus(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {
6
6
  }
7
7
 
8
- void FrameFocus::start(QStringList &arguments) {
8
+ void FrameFocus::start() {
9
9
  findFrames();
10
- switch(arguments.length()) {
10
+ switch(arguments().length()) {
11
11
  case 1:
12
- focusId(arguments[0]);
12
+ focusId(arguments()[0]);
13
13
  break;
14
14
  case 2:
15
- focusIndex(arguments[1].toInt());
15
+ focusIndex(arguments()[1].toInt());
16
16
  break;
17
17
  default:
18
18
  focusParent();
@@ -50,7 +50,7 @@ void FrameFocus::focusId(QString name) {
50
50
 
51
51
  void FrameFocus::focusParent() {
52
52
  if (page()->currentFrame()->parentFrame() == 0) {
53
- emit finished(new Response(false, "Already at parent frame."));
53
+ emit finished(new Response(false, QString("Already at parent frame.")));
54
54
  } else {
55
55
  page()->currentFrame()->parentFrame()->setFocus();
56
56
  success();
@@ -58,7 +58,7 @@ void FrameFocus::focusParent() {
58
58
  }
59
59
 
60
60
  void FrameFocus::frameNotFound() {
61
- emit finished(new Response(false, "Unable to locate frame. "));
61
+ emit finished(new Response(false, QString("Unable to locate frame. ")));
62
62
  }
63
63
 
64
64
  void FrameFocus::success() {
data/src/FrameFocus.h CHANGED
@@ -7,8 +7,8 @@ class FrameFocus : public Command {
7
7
  Q_OBJECT
8
8
 
9
9
  public:
10
- FrameFocus(WebPage *page, QObject *parent = 0);
11
- virtual void start(QStringList &arguments);
10
+ FrameFocus(WebPage *page, QStringList &arguments, QObject *parent = 0);
11
+ virtual void start();
12
12
 
13
13
  private:
14
14
  void findFrames();
data/src/GetCookies.cpp CHANGED
@@ -2,15 +2,13 @@
2
2
  #include "WebPage.h"
3
3
  #include "NetworkCookieJar.h"
4
4
 
5
- GetCookies::GetCookies(WebPage *page, QObject *parent)
6
- : Command(page, parent)
5
+ GetCookies::GetCookies(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent)
7
6
  {
8
7
  m_buffer = "";
9
8
  }
10
9
 
11
- void GetCookies::start(QStringList &arguments)
10
+ void GetCookies::start()
12
11
  {
13
- Q_UNUSED(arguments);
14
12
  NetworkCookieJar *jar = qobject_cast<NetworkCookieJar*>(page()
15
13
  ->networkAccessManager()
16
14
  ->cookieJar());
data/src/GetCookies.h CHANGED
@@ -6,8 +6,8 @@ class GetCookies : public Command {
6
6
  Q_OBJECT;
7
7
 
8
8
  public:
9
- GetCookies(WebPage *page, QObject *parent = 0);
10
- virtual void start(QStringList &arguments);
9
+ GetCookies(WebPage *page, QStringList &arguments, QObject *parent = 0);
10
+ virtual void start();
11
11
 
12
12
  private:
13
13
  QString m_buffer;
data/src/Header.cpp CHANGED
@@ -2,12 +2,12 @@
2
2
  #include "WebPage.h"
3
3
  #include "NetworkAccessManager.h"
4
4
 
5
- Header::Header(WebPage *page, QObject *parent) : Command(page, parent) {
5
+ Header::Header(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {
6
6
  }
7
7
 
8
- void Header::start(QStringList &arguments) {
9
- QString key = arguments[0];
10
- QString value = arguments[1];
8
+ void Header::start() {
9
+ QString key = arguments()[0];
10
+ QString value = arguments()[1];
11
11
  NetworkAccessManager* networkAccessManager = qobject_cast<NetworkAccessManager*>(page()->networkAccessManager());
12
12
  if (key.toLower().replace("-", "_") == "user_agent") {
13
13
  page()->setUserAgent(value);
data/src/Header.h CHANGED
@@ -6,6 +6,6 @@ class Header : public Command {
6
6
  Q_OBJECT
7
7
 
8
8
  public:
9
- Header(WebPage *page, QObject *parent = 0);
10
- virtual void start(QStringList &arguments);
9
+ Header(WebPage *page, QStringList &arguments, QObject *parent = 0);
10
+ virtual void start();
11
11
  };
data/src/Headers.cpp CHANGED
@@ -1,11 +1,10 @@
1
1
  #include "Headers.h"
2
2
  #include "WebPage.h"
3
3
 
4
- Headers::Headers(WebPage *page, QObject *parent) : Command(page, parent) {
4
+ Headers::Headers(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {
5
5
  }
6
6
 
7
- void Headers::start(QStringList &arguments) {
8
- Q_UNUSED(arguments);
7
+ void Headers::start() {
9
8
  emit finished(new Response(true, page()->pageHeaders()));
10
9
  }
11
10
 
data/src/Headers.h CHANGED
@@ -6,7 +6,7 @@ class Headers : public Command {
6
6
  Q_OBJECT
7
7
 
8
8
  public:
9
- Headers(WebPage *page, QObject *parent = 0);
10
- virtual void start(QStringList &arguments);
9
+ Headers(WebPage *page, QStringList &arguments, QObject *parent = 0);
10
+ virtual void start();
11
11
  };
12
12
 
@@ -0,0 +1,12 @@
1
+ #include "IgnoreSslErrors.h"
2
+ #include "WebPage.h"
3
+
4
+ IgnoreSslErrors::IgnoreSslErrors(WebPage *page, QStringList &arguments, QObject *parent) :
5
+ Command(page, arguments, parent) {
6
+ }
7
+
8
+ void IgnoreSslErrors::start() {
9
+ page()->ignoreSslErrors();
10
+ emit finished(new Response(true));
11
+ }
12
+
@@ -0,0 +1,12 @@
1
+ #include "Command.h"
2
+
3
+ class WebPage;
4
+
5
+ class IgnoreSslErrors : public Command {
6
+ Q_OBJECT
7
+
8
+ public:
9
+ IgnoreSslErrors(WebPage *page, QStringList &arguments, QObject *parent = 0);
10
+ virtual void start();
11
+ };
12
+
@@ -23,3 +23,7 @@ void NetworkAccessManager::addHeader(QString key, QString value) {
23
23
  m_headers.insert(key, value);
24
24
  };
25
25
 
26
+ void NetworkAccessManager::resetHeaders() {
27
+ m_headers.clear();
28
+ };
29
+
@@ -9,10 +9,11 @@ class NetworkAccessManager : public QNetworkAccessManager {
9
9
  public:
10
10
  NetworkAccessManager(QObject *parent = 0);
11
11
  void addHeader(QString key, QString value);
12
+ void resetHeaders();
12
13
 
13
14
  protected:
14
15
  QNetworkReply* createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice * outgoingData);
15
16
 
16
17
  private:
17
18
  QHash<QString, QString> m_headers;
18
- };
19
+ };
data/src/Node.cpp CHANGED
@@ -1,11 +1,11 @@
1
1
  #include "Node.h"
2
2
  #include "WebPage.h"
3
3
 
4
- Node::Node(WebPage *page, QObject *parent) : Command(page, parent) {
4
+ Node::Node(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {
5
5
  }
6
6
 
7
- void Node::start(QStringList &arguments) {
8
- QStringList functionArguments(arguments);
7
+ void Node::start() {
8
+ QStringList functionArguments(arguments());
9
9
  QString functionName = functionArguments.takeFirst();
10
10
  QVariant result = page()->invokeCapybaraFunction(functionName, functionArguments);
11
11
  QString attributeValue = result.toString();
data/src/Node.h CHANGED
@@ -7,7 +7,7 @@ class Node : public Command {
7
7
  Q_OBJECT
8
8
 
9
9
  public:
10
- Node(WebPage *page, QObject *parent = 0);
11
- virtual void start(QStringList &arguments);
10
+ Node(WebPage *page, QStringList &arguments, QObject *parent = 0);
11
+ virtual void start();
12
12
  };
13
13
 
@@ -0,0 +1,10 @@
1
+ #include "NullCommand.h"
2
+ #include "WebPage.h"
3
+
4
+ NullCommand::NullCommand(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {}
5
+
6
+ void NullCommand::start() {
7
+ QString failure = QString("[Capybara WebKit] Unknown command: ") + arguments()[0] + "\n";
8
+ emit finished(new Response(false, failure));
9
+ }
10
+
data/src/NullCommand.h ADDED
@@ -0,0 +1,11 @@
1
+ #include "Command.h"
2
+
3
+ class WebPage;
4
+
5
+ class NullCommand : public Command {
6
+ Q_OBJECT
7
+
8
+ public:
9
+ NullCommand(WebPage *page, QStringList &arguments, QObject *parent = 0);
10
+ virtual void start();
11
+ };
@@ -0,0 +1,46 @@
1
+ #include "PageLoadingCommand.h"
2
+ #include "Command.h"
3
+ #include "WebPage.h"
4
+
5
+ PageLoadingCommand::PageLoadingCommand(Command *command, WebPage *page, QObject *parent) : QObject(parent) {
6
+ m_page = page;
7
+ m_command = command;
8
+ m_pageLoadingFromCommand = false;
9
+ m_pageSuccess = true;
10
+ m_pendingResponse = NULL;
11
+ connect(m_page, SIGNAL(loadStarted()), this, SLOT(pageLoadingFromCommand()));
12
+ connect(m_page, SIGNAL(pageFinished(bool)), this, SLOT(pendingLoadFinished(bool)));
13
+ }
14
+
15
+ void PageLoadingCommand::start() {
16
+ connect(m_command, SIGNAL(finished(Response *)), this, SLOT(commandFinished(Response *)));
17
+ m_command->start();
18
+ };
19
+
20
+ void PageLoadingCommand::pendingLoadFinished(bool success) {
21
+ m_pageSuccess = success;
22
+ if (m_pageLoadingFromCommand) {
23
+ m_pageLoadingFromCommand = false;
24
+ if (m_pendingResponse) {
25
+ if (m_pageSuccess) {
26
+ emit finished(m_pendingResponse);
27
+ } else {
28
+ QString message = m_page->failureString();
29
+ emit finished(new Response(false, message));
30
+ }
31
+ }
32
+ }
33
+ }
34
+
35
+ void PageLoadingCommand::pageLoadingFromCommand() {
36
+ m_pageLoadingFromCommand = true;
37
+ }
38
+
39
+ void PageLoadingCommand::commandFinished(Response *response) {
40
+ disconnect(m_page, SIGNAL(loadStarted()), this, SLOT(pageLoadingFromCommand()));
41
+ m_command->deleteLater();
42
+ if (m_pageLoadingFromCommand)
43
+ m_pendingResponse = response;
44
+ else
45
+ emit finished(response);
46
+ }
@@ -0,0 +1,40 @@
1
+ #include <QObject>
2
+ #include <QStringList>
3
+
4
+ class Command;
5
+ class Response;
6
+ class WebPage;
7
+
8
+ /*
9
+ * Decorates a Command by deferring the finished() signal until any pending
10
+ * page loads are complete.
11
+ *
12
+ * If a Command starts a page load, no signal will be emitted until the page
13
+ * load is finished.
14
+ *
15
+ * If a pending page load fails, the command's response will be discarded and a
16
+ * failure response will be emitted instead.
17
+ */
18
+ class PageLoadingCommand : public QObject {
19
+ Q_OBJECT
20
+
21
+ public:
22
+ PageLoadingCommand(Command *command, WebPage *page, QObject *parent = 0);
23
+ void start();
24
+
25
+ public slots:
26
+ void pageLoadingFromCommand();
27
+ void pendingLoadFinished(bool success);
28
+ void commandFinished(Response *response);
29
+
30
+ signals:
31
+ void finished(Response *response);
32
+
33
+ private:
34
+ WebPage *m_page;
35
+ Command *m_command;
36
+ Response *m_pendingResponse;
37
+ bool m_pageSuccess;
38
+ bool m_pageLoadingFromCommand;
39
+ };
40
+
data/src/Render.cpp CHANGED
@@ -1,14 +1,13 @@
1
1
  #include "Render.h"
2
2
  #include "WebPage.h"
3
3
 
4
- Render::Render(WebPage *page, QObject *parent) : Command(page, parent) {
4
+ Render::Render(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {
5
5
  }
6
6
 
7
- void Render::start(QStringList &arguments) {
8
- QStringList functionArguments(arguments);
9
- QString imagePath = functionArguments.takeFirst();
10
- int width = functionArguments.takeFirst().toInt();
11
- int height = functionArguments.takeFirst().toInt();
7
+ void Render::start() {
8
+ QString imagePath = arguments()[0];
9
+ int width = arguments()[1].toInt();
10
+ int height = arguments()[2].toInt();
12
11
 
13
12
  QSize size(width, height);
14
13
  page()->setViewportSize(size);
data/src/Render.h CHANGED
@@ -7,6 +7,6 @@ class Render : public Command {
7
7
  Q_OBJECT
8
8
 
9
9
  public:
10
- Render(WebPage *page, QObject *parent = 0);
11
- virtual void start(QStringList &arguments);
10
+ Render(WebPage *page, QStringList &arguments, QObject *parent = 0);
11
+ virtual void start();
12
12
  };
data/src/RequestedUrl.cpp CHANGED
@@ -1,15 +1,12 @@
1
1
  #include "RequestedUrl.h"
2
2
  #include "WebPage.h"
3
3
 
4
- RequestedUrl::RequestedUrl(WebPage *page, QObject *parent) : Command(page, parent) {
4
+ RequestedUrl::RequestedUrl(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {
5
5
  }
6
6
 
7
- void RequestedUrl::start(QStringList &arguments) {
8
- Q_UNUSED(arguments);
9
-
7
+ void RequestedUrl::start() {
10
8
  QUrl humanUrl = page()->currentFrame()->requestedUrl();
11
9
  QByteArray encodedBytes = humanUrl.toEncoded();
12
- QString urlString = QString(encodedBytes);
13
- emit finished(new Response(true, urlString));
10
+ emit finished(new Response(true, encodedBytes));
14
11
  }
15
12