capybara-webkit 0.12.1 → 0.13.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 (141) hide show
  1. data/.gitignore +2 -1
  2. data/GOALS +9 -0
  3. data/Gemfile.lock +15 -12
  4. data/LICENSE +1 -1
  5. data/NEWS.md +18 -0
  6. data/README.md +81 -2
  7. data/capybara-webkit.gemspec +1 -1
  8. data/lib/capybara/webkit.rb +11 -6
  9. data/lib/capybara/{driver/webkit → webkit}/browser.rb +90 -4
  10. data/lib/capybara/{driver/webkit → webkit}/connection.rb +48 -47
  11. data/lib/capybara/{driver/webkit → webkit}/cookie_jar.rb +1 -1
  12. data/lib/capybara/webkit/driver.rb +186 -0
  13. data/lib/capybara/webkit/errors.rb +10 -0
  14. data/lib/capybara/{driver/webkit → webkit}/node.rb +12 -4
  15. data/lib/capybara/{driver/webkit → webkit}/socket_debugger.rb +4 -1
  16. data/lib/capybara/{driver/webkit → webkit}/version.rb +1 -1
  17. data/lib/capybara_webkit_builder.rb +17 -3
  18. data/spec/browser_spec.rb +95 -7
  19. data/spec/connection_spec.rb +16 -5
  20. data/spec/cookie_jar_spec.rb +3 -3
  21. data/spec/driver_rendering_spec.rb +19 -26
  22. data/spec/driver_resize_window_spec.rb +3 -3
  23. data/spec/driver_spec.rb +1200 -822
  24. data/spec/integration/driver_spec.rb +4 -3
  25. data/spec/selenium_compatibility_spec.rb +49 -0
  26. data/spec/spec_helper.rb +14 -6
  27. data/spec/support/app_runner.rb +94 -0
  28. data/src/Authenticate.cpp +18 -0
  29. data/src/Authenticate.h +12 -0
  30. data/src/Body.h +3 -5
  31. data/src/ClearCookies.cpp +3 -5
  32. data/src/ClearCookies.h +3 -5
  33. data/src/ClearPromptText.cpp +11 -0
  34. data/src/ClearPromptText.h +9 -0
  35. data/src/Command.cpp +4 -15
  36. data/src/Command.h +3 -14
  37. data/src/CommandFactory.cpp +20 -6
  38. data/src/CommandFactory.h +3 -2
  39. data/src/CommandParser.cpp +1 -1
  40. data/src/Connection.cpp +22 -21
  41. data/src/Connection.h +5 -6
  42. data/src/ConsoleMessages.cpp +2 -1
  43. data/src/ConsoleMessages.h +3 -5
  44. data/src/CurrentUrl.cpp +9 -48
  45. data/src/CurrentUrl.h +8 -8
  46. data/src/EnableLogging.cpp +10 -0
  47. data/src/EnableLogging.h +12 -0
  48. data/src/Evaluate.cpp +2 -1
  49. data/src/Evaluate.h +3 -5
  50. data/src/Execute.cpp +2 -1
  51. data/src/Execute.h +3 -5
  52. data/src/Find.cpp +3 -2
  53. data/src/Find.h +3 -5
  54. data/src/FrameFocus.cpp +3 -2
  55. data/src/FrameFocus.h +3 -4
  56. data/src/GetCookies.cpp +3 -4
  57. data/src/GetCookies.h +3 -5
  58. data/src/GetTimeout.cpp +9 -0
  59. data/src/GetTimeout.h +11 -0
  60. data/src/GetWindowHandle.cpp +11 -0
  61. data/src/GetWindowHandle.h +10 -0
  62. data/src/GetWindowHandles.cpp +20 -0
  63. data/src/GetWindowHandles.h +10 -0
  64. data/src/Header.cpp +2 -1
  65. data/src/Header.h +3 -5
  66. data/src/Headers.cpp +8 -2
  67. data/src/Headers.h +3 -5
  68. data/src/IgnoreSslErrors.cpp +4 -3
  69. data/src/IgnoreSslErrors.h +3 -5
  70. data/src/JavascriptAlertMessages.cpp +10 -0
  71. data/src/JavascriptAlertMessages.h +9 -0
  72. data/src/JavascriptConfirmMessages.cpp +10 -0
  73. data/src/JavascriptConfirmMessages.h +9 -0
  74. data/src/JavascriptInvocation.cpp +1 -1
  75. data/src/JavascriptInvocation.h +1 -1
  76. data/src/JavascriptPromptMessages.cpp +10 -0
  77. data/src/JavascriptPromptMessages.h +9 -0
  78. data/src/NetworkAccessManager.cpp +38 -5
  79. data/src/NetworkAccessManager.h +20 -0
  80. data/src/Node.cpp +6 -1
  81. data/src/Node.h +4 -5
  82. data/src/NullCommand.cpp +5 -2
  83. data/src/NullCommand.h +4 -3
  84. data/src/PageLoadingCommand.cpp +12 -7
  85. data/src/PageLoadingCommand.h +6 -9
  86. data/src/Render.cpp +2 -1
  87. data/src/Render.h +3 -5
  88. data/src/RequestedUrl.cpp +2 -1
  89. data/src/RequestedUrl.h +3 -5
  90. data/src/Reset.cpp +3 -17
  91. data/src/Reset.h +3 -8
  92. data/src/ResizeWindow.cpp +2 -1
  93. data/src/ResizeWindow.h +3 -5
  94. data/src/Response.cpp +4 -0
  95. data/src/Response.h +1 -0
  96. data/src/Server.cpp +2 -3
  97. data/src/Server.h +0 -2
  98. data/src/SetConfirmAction.cpp +11 -0
  99. data/src/SetConfirmAction.h +9 -0
  100. data/src/SetCookie.cpp +3 -4
  101. data/src/SetCookie.h +3 -5
  102. data/src/SetPromptAction.cpp +11 -0
  103. data/src/SetPromptAction.h +9 -0
  104. data/src/SetPromptText.cpp +11 -0
  105. data/src/SetPromptText.h +9 -0
  106. data/src/SetProxy.cpp +2 -1
  107. data/src/SetProxy.h +3 -5
  108. data/src/SetSkipImageLoading.cpp +12 -0
  109. data/src/SetSkipImageLoading.h +9 -0
  110. data/src/SetTimeout.cpp +19 -0
  111. data/src/SetTimeout.h +9 -0
  112. data/src/SocketCommand.cpp +21 -0
  113. data/src/SocketCommand.h +29 -0
  114. data/src/Source.cpp +3 -2
  115. data/src/Source.h +3 -4
  116. data/src/Status.cpp +2 -1
  117. data/src/Status.h +3 -5
  118. data/src/TimeoutCommand.cpp +69 -0
  119. data/src/TimeoutCommand.h +41 -0
  120. data/src/UnsupportedContentHandler.cpp +11 -17
  121. data/src/UnsupportedContentHandler.h +5 -3
  122. data/src/Url.cpp +2 -1
  123. data/src/Url.h +3 -5
  124. data/src/Visit.cpp +3 -2
  125. data/src/Visit.h +3 -5
  126. data/src/WebPage.cpp +129 -44
  127. data/src/WebPage.h +37 -11
  128. data/src/WebPageManager.cpp +127 -0
  129. data/src/WebPageManager.h +59 -0
  130. data/src/WindowFocus.cpp +32 -0
  131. data/src/WindowFocus.h +15 -0
  132. data/src/body.cpp +2 -1
  133. data/src/capybara.js +38 -10
  134. data/src/find_command.h +17 -2
  135. data/src/main.cpp +0 -2
  136. data/src/webkit_server.pro +36 -0
  137. data/templates/Command.cpp +2 -4
  138. data/templates/Command.h +3 -3
  139. metadata +106 -27
  140. data/ChangeLog +0 -70
  141. data/lib/capybara/driver/webkit.rb +0 -136
@@ -1,12 +1,10 @@
1
- #include "Command.h"
1
+ #include "SocketCommand.h"
2
2
 
3
- class WebPage;
4
-
5
- class Status : public Command {
3
+ class Status : public SocketCommand {
6
4
  Q_OBJECT
7
5
 
8
6
  public:
9
- Status(WebPage *page, QStringList &arguments, QObject *parent = 0);
7
+ Status(WebPageManager *, QStringList &arguments, QObject *parent = 0);
10
8
  virtual void start();
11
9
  };
12
10
 
@@ -0,0 +1,69 @@
1
+ #include "TimeoutCommand.h"
2
+ #include "Command.h"
3
+ #include "WebPageManager.h"
4
+ #include "WebPage.h"
5
+ #include <QTimer>
6
+
7
+ TimeoutCommand::TimeoutCommand(Command *command, WebPageManager *manager, QObject *parent) : Command(parent) {
8
+ m_command = command;
9
+ m_manager = manager;
10
+ m_timer = new QTimer(this);
11
+ m_timer->setSingleShot(true);
12
+ connect(m_timer, SIGNAL(timeout()), this, SLOT(commandTimeout()));
13
+ connect(m_manager, SIGNAL(loadStarted()), this, SLOT(pageLoadingFromCommand()));
14
+ }
15
+
16
+ void TimeoutCommand::start() {
17
+ if (m_manager->isLoading()) {
18
+ m_manager->logger() << this->toString() << "waiting for load to finish";
19
+ connect(m_manager, SIGNAL(pageFinished(bool)), this, SLOT(pendingLoadFinished(bool)));
20
+ startTimeout();
21
+ } else {
22
+ startCommand();
23
+ }
24
+ }
25
+
26
+ void TimeoutCommand::startCommand() {
27
+ connect(m_command, SIGNAL(finished(Response *)), this, SLOT(commandFinished(Response *)));
28
+ m_command->start();
29
+ }
30
+
31
+ void TimeoutCommand::startTimeout() {
32
+ int timeout = m_manager->getTimeout();
33
+ if (timeout > 0) {
34
+ m_timer->start(timeout * 1000);
35
+ }
36
+ }
37
+
38
+ void TimeoutCommand::pendingLoadFinished(bool success) {
39
+ if (success) {
40
+ startCommand();
41
+ } else {
42
+ disconnect(m_timer, SIGNAL(timeout()), this, SLOT(commandTimeout()));
43
+ disconnect(m_manager, SIGNAL(loadStarted()), this, SLOT(pageLoadingFromCommand()));
44
+ disconnect(m_manager, SIGNAL(pageFinished(bool)), this, SLOT(pendingLoadFinished(bool)));
45
+ emit finished(new Response(false, m_manager->currentPage()->failureString()));
46
+ }
47
+ }
48
+
49
+ void TimeoutCommand::pageLoadingFromCommand() {
50
+ startTimeout();
51
+ }
52
+
53
+ void TimeoutCommand::commandTimeout() {
54
+ disconnect(m_manager, SIGNAL(loadStarted()), this, SLOT(pageLoadingFromCommand()));
55
+ disconnect(m_manager, SIGNAL(pageFinished(bool)), this, SLOT(pendingLoadFinished(bool)));
56
+ disconnect(m_command, SIGNAL(finished(Response *)), this, SLOT(commandFinished(Response *)));
57
+ m_manager->currentPage()->triggerAction(QWebPage::Stop);
58
+ m_command->deleteLater();
59
+ emit finished(new Response(false, QString("timeout")));
60
+ }
61
+
62
+ void TimeoutCommand::commandFinished(Response *response) {
63
+ disconnect(m_timer, SIGNAL(timeout()), this, SLOT(commandTimeout()));
64
+ disconnect(m_manager, SIGNAL(loadStarted()), this, SLOT(pageLoadingFromCommand()));
65
+ disconnect(m_manager, SIGNAL(pageFinished(bool)), this, SLOT(pendingLoadFinished(bool)));
66
+ m_command->deleteLater();
67
+ emit finished(response);
68
+ }
69
+
@@ -0,0 +1,41 @@
1
+ #include "Command.h"
2
+ #include <QObject>
3
+ #include <QStringList>
4
+
5
+ class Response;
6
+ class WebPageManager;
7
+ class QTimer;
8
+
9
+ /* Decorates a command with a timeout.
10
+ *
11
+ * If the timeout, using a QTimer is reached before
12
+ * the command is finished, the load page load will
13
+ * be stopped and failure response will be issued.
14
+ *
15
+ */
16
+ class TimeoutCommand : public Command {
17
+ Q_OBJECT
18
+
19
+ public:
20
+ TimeoutCommand(Command *command, WebPageManager *page, QObject *parent = 0);
21
+ virtual void start();
22
+
23
+ public slots:
24
+ void commandTimeout();
25
+ void commandFinished(Response *response);
26
+ void pageLoadingFromCommand();
27
+ void pendingLoadFinished(bool);
28
+
29
+ signals:
30
+ void finished(Response *response);
31
+
32
+ protected:
33
+ void startCommand();
34
+ void startTimeout();
35
+
36
+ private:
37
+ WebPageManager *m_manager;
38
+ QTimer *m_timer;
39
+ Command *m_command;
40
+ };
41
+
@@ -5,28 +5,22 @@
5
5
  UnsupportedContentHandler::UnsupportedContentHandler(WebPage *page, QNetworkReply *reply, QObject *parent) : QObject(parent) {
6
6
  m_page = page;
7
7
  m_reply = reply;
8
- connect(m_reply, SIGNAL(finished()), this, SLOT(handleUnsupportedContent()));
9
- disconnect(m_page, SIGNAL(loadFinished(bool)), m_page, SLOT(loadFinished(bool)));
10
8
  }
11
9
 
12
- void UnsupportedContentHandler::handleUnsupportedContent() {
13
- QVariant contentMimeType = m_reply->header(QNetworkRequest::ContentTypeHeader);
14
- if(contentMimeType.isNull()) {
15
- this->finish(false);
16
- } else {
17
- this->loadUnsupportedContent();
18
- this->finish(true);
19
- }
10
+ void UnsupportedContentHandler::renderNonHtmlContent() {
11
+ QByteArray text = m_reply->readAll();
12
+ m_page->mainFrame()->setContent(text, QString("text/plain"), m_reply->url());
13
+ m_page->networkAccessManagerFinishedReply(m_reply);
14
+ m_page->loadFinished(true);
20
15
  this->deleteLater();
21
16
  }
22
17
 
23
- void UnsupportedContentHandler::loadUnsupportedContent() {
24
- QByteArray text = m_reply->readAll();
25
- m_page->mainFrame()->setContent(text, QString("text/plain"), m_reply->url());
18
+ void UnsupportedContentHandler::waitForReplyToFinish() {
19
+ connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished()));
20
+ disconnect(m_page, SIGNAL(loadFinished(bool)), m_page, SLOT(loadFinished(bool)));
26
21
  }
27
22
 
28
- void UnsupportedContentHandler::finish(bool success) {
29
- connect(m_page, SIGNAL(loadFinished(bool)), m_page, SLOT(loadFinished(bool)));
30
- m_page->replyFinished(m_reply);
31
- m_page->loadFinished(success);
23
+ void UnsupportedContentHandler::replyFinished() {
24
+ renderNonHtmlContent();
25
+ connect(m_page, SIGNAL(loadFinished(bool)), m_page, SLOT(loadFinished(bool)));
32
26
  }
@@ -1,18 +1,20 @@
1
1
  #include <QObject>
2
+
2
3
  class WebPage;
3
4
  class QNetworkReply;
5
+
4
6
  class UnsupportedContentHandler : public QObject {
5
7
  Q_OBJECT
6
8
 
7
9
  public:
8
10
  UnsupportedContentHandler(WebPage *page, QNetworkReply *reply, QObject *parent = 0);
11
+ void waitForReplyToFinish();
12
+ void renderNonHtmlContent();
9
13
 
10
14
  public slots:
11
- void handleUnsupportedContent();
15
+ void replyFinished();
12
16
 
13
17
  private:
14
18
  WebPage *m_page;
15
19
  QNetworkReply *m_reply;
16
- void loadUnsupportedContent();
17
- void finish(bool success);
18
20
  };
@@ -1,7 +1,8 @@
1
1
  #include "Url.h"
2
2
  #include "WebPage.h"
3
+ #include "WebPageManager.h"
3
4
 
4
- Url::Url(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {
5
+ Url::Url(WebPageManager *manager, QStringList &arguments, QObject *parent) : SocketCommand(manager, arguments, parent) {
5
6
  }
6
7
 
7
8
  void Url::start() {
data/src/Url.h CHANGED
@@ -1,12 +1,10 @@
1
- #include "Command.h"
1
+ #include "SocketCommand.h"
2
2
 
3
- class WebPage;
4
-
5
- class Url : public Command {
3
+ class Url : public SocketCommand {
6
4
  Q_OBJECT
7
5
 
8
6
  public:
9
- Url(WebPage *page, QStringList &arguments, QObject *parent = 0);
7
+ Url(WebPageManager *, QStringList &arguments, QObject *parent = 0);
10
8
  virtual void start();
11
9
  };
12
10
 
@@ -1,8 +1,9 @@
1
1
  #include "Visit.h"
2
- #include "Command.h"
2
+ #include "SocketCommand.h"
3
3
  #include "WebPage.h"
4
+ #include "WebPageManager.h"
4
5
 
5
- Visit::Visit(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, arguments, parent) {
6
+ Visit::Visit(WebPageManager *manager, QStringList &arguments, QObject *parent) : SocketCommand(manager, arguments, parent) {
6
7
  }
7
8
 
8
9
  void Visit::start() {
@@ -1,12 +1,10 @@
1
- #include "Command.h"
1
+ #include "SocketCommand.h"
2
2
 
3
- class WebPage;
4
-
5
- class Visit : public Command {
3
+ class Visit : public SocketCommand {
6
4
  Q_OBJECT
7
5
 
8
6
  public:
9
- Visit(WebPage *page, QStringList &arguments, QObject *parent = 0);
7
+ Visit(WebPageManager *manager, QStringList &arguments, QObject *parent = 0);
10
8
  virtual void start();
11
9
  };
12
10
 
@@ -1,18 +1,27 @@
1
1
  #include "WebPage.h"
2
+ #include "WebPageManager.h"
2
3
  #include "JavascriptInvocation.h"
3
4
  #include "NetworkAccessManager.h"
4
5
  #include "NetworkCookieJar.h"
5
6
  #include "UnsupportedContentHandler.h"
6
7
  #include <QResource>
7
8
  #include <iostream>
9
+ #include <QWebSettings>
10
+ #include <QUuid>
11
+
12
+ WebPage::WebPage(WebPageManager *manager, QObject *parent) : QWebPage(parent) {
13
+ m_loading = false;
14
+ m_failed = false;
15
+ m_manager = manager;
16
+ m_uuid = QUuid::createUuid().toString();
8
17
 
9
- WebPage::WebPage(QObject *parent) : QWebPage(parent) {
10
18
  setForwardUnsupportedContent(true);
11
19
  loadJavascript();
12
20
  setUserStylesheet();
13
21
 
14
- m_loading = false;
15
- m_ignoreSslErrors = false;
22
+ m_confirm = true;
23
+ m_prompt = false;
24
+ m_prompt_text = QString();
16
25
  this->setCustomNetworkAccessManager();
17
26
 
18
27
  connect(this, SIGNAL(loadStarted()), this, SLOT(loadStarted()));
@@ -22,6 +31,9 @@ WebPage::WebPage(QObject *parent) : QWebPage(parent) {
22
31
  connect(this, SIGNAL(unsupportedContent(QNetworkReply*)),
23
32
  this, SLOT(handleUnsupportedContent(QNetworkReply*)));
24
33
  resetWindowSize();
34
+
35
+ settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, true);
36
+ currentFrame()->setUrl(QUrl("about:blank"));
25
37
  }
26
38
 
27
39
  void WebPage::resetWindowSize() {
@@ -30,12 +42,21 @@ void WebPage::resetWindowSize() {
30
42
  }
31
43
 
32
44
  void WebPage::setCustomNetworkAccessManager() {
33
- NetworkAccessManager *manager = new NetworkAccessManager();
34
- manager->setCookieJar(new NetworkCookieJar());
45
+ NetworkAccessManager *manager = new NetworkAccessManager(this);
46
+ manager->setCookieJar(m_manager->cookieJar());
35
47
  this->setNetworkAccessManager(manager);
36
- connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));
48
+ connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(networkAccessManagerFinishedReply(QNetworkReply *)));
37
49
  connect(manager, SIGNAL(sslErrors(QNetworkReply *, QList<QSslError>)),
38
50
  this, SLOT(handleSslErrorsForReply(QNetworkReply *, QList<QSslError>)));
51
+ connect(manager, SIGNAL(requestCreated(QByteArray &, QNetworkReply *)), this, SLOT(networkAccessManagerCreatedRequest(QByteArray &, QNetworkReply *)));
52
+ }
53
+
54
+ void WebPage::networkAccessManagerCreatedRequest(QByteArray &url, QNetworkReply *reply) {
55
+ emit requestCreated(url, reply);
56
+ }
57
+
58
+ void WebPage::networkAccessManagerFinishedReply(QNetworkReply *reply) {
59
+ emit replyFinished(reply);
39
60
  }
40
61
 
41
62
  void WebPage::loadJavascript() {
@@ -69,6 +90,18 @@ QString WebPage::consoleMessages() {
69
90
  return m_consoleMessages.join("\n");
70
91
  }
71
92
 
93
+ QString WebPage::alertMessages() {
94
+ return m_alertMessages.join("\n");
95
+ }
96
+
97
+ QString WebPage::confirmMessages() {
98
+ return m_confirmMessages.join("\n");
99
+ }
100
+
101
+ QString WebPage::promptMessages() {
102
+ return m_promptMessages.join("\n");
103
+ }
104
+
72
105
  void WebPage::setUserAgent(QString userAgent) {
73
106
  m_userAgent = userAgent;
74
107
  }
@@ -87,7 +120,7 @@ bool WebPage::shouldInterruptJavaScript() {
87
120
  return false;
88
121
  }
89
122
 
90
- QVariant WebPage::invokeCapybaraFunction(const char *name, QStringList &arguments) {
123
+ QVariant WebPage::invokeCapybaraFunction(const char *name, const QStringList &arguments) {
91
124
  QString qname(name);
92
125
  QString objectName("CapybaraInvocation");
93
126
  JavascriptInvocation invocation(qname, arguments);
@@ -96,7 +129,7 @@ QVariant WebPage::invokeCapybaraFunction(const char *name, QStringList &argument
96
129
  return currentFrame()->evaluateJavaScript(javascript);
97
130
  }
98
131
 
99
- QVariant WebPage::invokeCapybaraFunction(QString &name, QStringList &arguments) {
132
+ QVariant WebPage::invokeCapybaraFunction(QString &name, const QStringList &arguments) {
100
133
  return invokeCapybaraFunction(name.toAscii().data(), arguments);
101
134
  }
102
135
 
@@ -110,30 +143,39 @@ void WebPage::javaScriptConsoleMessage(const QString &message, int lineNumber, c
110
143
 
111
144
  void WebPage::javaScriptAlert(QWebFrame *frame, const QString &message) {
112
145
  Q_UNUSED(frame);
146
+ m_alertMessages.append(message);
113
147
  std::cout << "ALERT: " << qPrintable(message) << std::endl;
114
148
  }
115
149
 
116
150
  bool WebPage::javaScriptConfirm(QWebFrame *frame, const QString &message) {
117
151
  Q_UNUSED(frame);
118
- Q_UNUSED(message);
119
- return true;
152
+ m_confirmMessages.append(message);
153
+ return m_confirm;
120
154
  }
121
155
 
122
156
  bool WebPage::javaScriptPrompt(QWebFrame *frame, const QString &message, const QString &defaultValue, QString *result) {
123
157
  Q_UNUSED(frame)
124
- Q_UNUSED(message)
125
- Q_UNUSED(defaultValue)
126
- Q_UNUSED(result)
127
- return false;
158
+ m_promptMessages.append(message);
159
+ if (m_prompt) {
160
+ if (m_prompt_text.isNull()) {
161
+ *result = defaultValue;
162
+ } else {
163
+ *result = m_prompt_text;
164
+ }
165
+ }
166
+ return m_prompt;
128
167
  }
129
168
 
130
169
  void WebPage::loadStarted() {
131
170
  m_loading = true;
171
+ m_errorPageMessage = QString();
132
172
  }
133
173
 
134
174
  void WebPage::loadFinished(bool success) {
175
+ Q_UNUSED(success);
135
176
  m_loading = false;
136
- emit pageFinished(success);
177
+ emit pageFinished(!m_failed);
178
+ m_failed = false;
137
179
  }
138
180
 
139
181
  bool WebPage::isLoading() const {
@@ -141,7 +183,11 @@ bool WebPage::isLoading() const {
141
183
  }
142
184
 
143
185
  QString WebPage::failureString() {
144
- return QString("Unable to load URL: ") + currentFrame()->requestedUrl().toString();
186
+ QString message = QString("Unable to load URL: ") + currentFrame()->requestedUrl().toString();
187
+ if (m_errorPageMessage.isEmpty())
188
+ return message;
189
+ else
190
+ return message + m_errorPageMessage;
145
191
  }
146
192
 
147
193
  bool WebPage::render(const QString &fileName) {
@@ -179,12 +225,17 @@ QString WebPage::chooseFile(QWebFrame *parentFrame, const QString &suggestedFile
179
225
  }
180
226
 
181
227
  bool WebPage::extension(Extension extension, const ExtensionOption *option, ExtensionReturn *output) {
182
- Q_UNUSED(option);
183
228
  if (extension == ChooseMultipleFilesExtension) {
184
229
  QStringList names = QStringList() << getLastAttachedFileName();
185
230
  static_cast<ChooseMultipleFilesExtensionReturn*>(output)->fileNames = names;
186
231
  return true;
187
232
  }
233
+ else if (extension == QWebPage::ErrorPageExtension) {
234
+ ErrorPageExtensionOption *errorOption = (ErrorPageExtensionOption*) option;
235
+ m_errorPageMessage = " because of error loading " + errorOption->url.toString() + ": " + errorOption->errorString;
236
+ m_failed = true;
237
+ return false;
238
+ }
188
239
  return false;
189
240
  }
190
241
 
@@ -192,48 +243,82 @@ QString WebPage::getLastAttachedFileName() {
192
243
  return currentFrame()->evaluateJavaScript(QString("Capybara.lastAttachedFile")).toString();
193
244
  }
194
245
 
195
- void WebPage::replyFinished(QNetworkReply *reply) {
196
- if (reply->url() == this->currentFrame()->url()) {
197
- QStringList headers;
198
- m_lastStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
199
- QList<QByteArray> list = reply->rawHeaderList();
246
+ void WebPage::handleSslErrorsForReply(QNetworkReply *reply, const QList<QSslError> &errors) {
247
+ if (m_manager->ignoreSslErrors())
248
+ reply->ignoreSslErrors(errors);
249
+ }
200
250
 
201
- int length = list.size();
202
- for(int i = 0; i < length; i++) {
203
- headers << list.at(i)+": "+reply->rawHeader(list.at(i));
204
- }
251
+ void WebPage::setSkipImageLoading(bool skip) {
252
+ settings()->setAttribute(QWebSettings::AutoLoadImages, !skip);
253
+ }
254
+
255
+ int WebPage::getLastStatus() {
256
+ return qobject_cast<NetworkAccessManager *>(networkAccessManager())->statusFor(currentFrame()->url());
257
+ }
205
258
 
206
- m_pageHeaders = headers.join("\n");
259
+ const QList<QNetworkReply::RawHeaderPair> &WebPage::pageHeaders() {
260
+ return qobject_cast<NetworkAccessManager *>(networkAccessManager())->headersFor(currentFrame()->url());
261
+ }
262
+
263
+ void WebPage::handleUnsupportedContent(QNetworkReply *reply) {
264
+ QVariant contentMimeType = reply->header(QNetworkRequest::ContentTypeHeader);
265
+ if(!contentMimeType.isNull()) {
266
+ triggerAction(QWebPage::Stop);
267
+ UnsupportedContentHandler *handler = new UnsupportedContentHandler(this, reply);
268
+ if (reply->isFinished())
269
+ handler->renderNonHtmlContent();
270
+ else
271
+ handler->waitForReplyToFinish();
207
272
  }
208
273
  }
209
274
 
210
- void WebPage::handleSslErrorsForReply(QNetworkReply *reply, const QList<QSslError> &errors) {
211
- if (m_ignoreSslErrors)
212
- reply->ignoreSslErrors(errors);
275
+ bool WebPage::supportsExtension(Extension extension) const {
276
+ if (extension == ErrorPageExtension)
277
+ return true;
278
+ else if (extension == ChooseMultipleFilesExtension)
279
+ return true;
280
+ else
281
+ return false;
213
282
  }
214
283
 
215
- void WebPage::ignoreSslErrors() {
216
- m_ignoreSslErrors = true;
284
+ QWebPage *WebPage::createWindow(WebWindowType type) {
285
+ Q_UNUSED(type);
286
+ return m_manager->createPage(this);
217
287
  }
218
288
 
219
- int WebPage::getLastStatus() {
220
- return m_lastStatus;
289
+ QString WebPage::uuid() {
290
+ return m_uuid;
221
291
  }
222
292
 
223
- void WebPage::resetResponseHeaders() {
224
- m_lastStatus = 0;
225
- m_pageHeaders = QString();
293
+ QString WebPage::getWindowName() {
294
+ QVariant windowName = mainFrame()->evaluateJavaScript("window.name");
295
+
296
+ if (windowName.isValid())
297
+ return windowName.toString();
298
+ else
299
+ return "";
226
300
  }
227
301
 
228
- void WebPage::resetConsoleMessages() {
229
- m_consoleMessages.clear();
302
+ bool WebPage::matchesWindowSelector(QString selector) {
303
+ return (selector == getWindowName() ||
304
+ selector == mainFrame()->title() ||
305
+ selector == mainFrame()->url().toString() ||
306
+ selector == uuid());
230
307
  }
231
308
 
232
- QString WebPage::pageHeaders() {
233
- return m_pageHeaders;
309
+ void WebPage::setFocus() {
310
+ m_manager->setCurrentPage(this);
234
311
  }
235
312
 
236
- void WebPage::handleUnsupportedContent(QNetworkReply *reply) {
237
- UnsupportedContentHandler *handler = new UnsupportedContentHandler(this, reply);
238
- Q_UNUSED(handler);
313
+ void WebPage::setConfirmAction(QString action) {
314
+ m_confirm = (action == "Yes");
239
315
  }
316
+
317
+ void WebPage::setPromptAction(QString action) {
318
+ m_prompt = (action == "Yes");
319
+ }
320
+
321
+ void WebPage::setPromptText(QString text) {
322
+ m_prompt_text = text;
323
+ }
324
+