capybara-webkit 0.12.1 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
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
+