capybara-webkit 0.11.0 → 0.12.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.
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