Permalink
Browse files

Merge in upstream changes.

* New CurrentURL command.
* Bug fix for setting a inputs values.
* History is cleared in the Reset command.
  • Loading branch information...
1 parent 5f1a9d6 commit 33b4e609aa302d0e8a5f951b21aae37548ab876e @tristandunn committed Mar 14, 2012
Showing with 102 additions and 1 deletion.
  1. +1 −0 src/CommandFactory.cpp
  2. +71 −0 src/CurrentUrl.cpp
  3. +16 −0 src/CurrentUrl.h
  4. +7 −0 src/Reset.cpp
  5. +3 −0 src/Reset.h
  6. +1 −0 src/find_command.h
  7. +1 −1 src/webkit_server.js
  8. +2 −0 src/webkit_server.pro
View
1 src/CommandFactory.cpp
@@ -20,6 +20,7 @@
#include "SetProxy.h"
#include "ConsoleMessages.h"
#include "RequestedUrl.h"
+#include "CurrentUrl.h"
CommandFactory::CommandFactory(WebPage *page, QObject *parent) : QObject(parent) {
m_page = page;
View
71 src/CurrentUrl.cpp
@@ -0,0 +1,71 @@
+#include "CurrentUrl.h"
+#include "WebPage.h"
+
+CurrentUrl::CurrentUrl(WebPage *page, QObject *parent) : Command(page, parent) {
+}
+
+/*
+ * This CurrentUrl command attempts to produce a current_url value consistent
+ * with that returned by the Selenium WebDriver Capybara driver.
+ *
+ * It does not currently return the correct value in the case of an iframe whose
+ * source URL results in a redirect because the loading of the iframe does not
+ * generate a history item. This is most likely a rare case and is consistent
+ * with the current behavior of the capybara-webkit driver.
+ *
+ * The following two values are *not* affected by Javascript pushState.
+ *
+ * QWebFrame->url()
+ * QWebHistoryItem.originalUrl()
+ *
+ * The following two values *are* affected by Javascript pushState.
+ *
+ * QWebFrame->requestedUrl()
+ * QWebHistoryItem.url()
+ *
+ * In the cases that we have access to both the QWebFrame values and the
+ * correct history item for that frame, we can compare the values and determine
+ * if a redirect occurred and if pushState was used. The table below describes
+ * the various combinations of URL values that are possible.
+ *
+ * O -> originally requested URL
+ * R -> URL after redirection
+ * P -> URL set by pushState
+ * * -> denotes the desired URL value from the frame
+ *
+ * frame history
+ * case url requestedUrl url originalUrl
+ * -----------------------------------------------------------------
+ * regular load O O* O O
+ *
+ * redirect w/o R* O R O
+ * pushState
+ *
+ * pushState O P* P O
+ * only
+ *
+ * redirect w/ R P* P O
+ * pushState
+ *
+ * Based on the above information, we only need to check for the case of a
+ * redirect w/o pushState, in which case QWebFrame->url() will have the correct
+ * current_url value. In all other cases QWebFrame->requestedUrl() is correct.
+ */
+void CurrentUrl::start(QStringList &arguments) {
+ Q_UNUSED(arguments);
+
+ QUrl humanUrl = wasRedirectedAndNotModifiedByJavascript() ?
+ page()->currentFrame()->url() : page()->currentFrame()->requestedUrl();
+ QByteArray encodedBytes = humanUrl.toEncoded();
+ QString urlString = QString(encodedBytes);
+ emit finished(new Response(true, urlString));
+}
+
+bool CurrentUrl::wasRegularLoad() {
+ return page()->currentFrame()->url() == page()->currentFrame()->requestedUrl();
+}
+
+bool CurrentUrl::wasRedirectedAndNotModifiedByJavascript() {
+ return !wasRegularLoad() && page()->currentFrame()->url() == page()->history()->currentItem().url();
+}
+
View
16 src/CurrentUrl.h
@@ -0,0 +1,16 @@
+#include "Command.h"
+
+class WebPage;
+
+class CurrentUrl : public Command {
+ Q_OBJECT
+
+ public:
+ CurrentUrl(WebPage *page, QObject *parent = 0);
+ virtual void start(QStringList &arguments);
+
+ private:
+ bool wasRegularLoad();
+ bool wasRedirectedAndNotModifiedByJavascript();
+};
+
View
7 src/Reset.cpp
@@ -16,6 +16,13 @@ void Reset::start(QStringList &arguments) {
page()->setUserAgent(NULL);
page()->resetResponseHeaders();
page()->resetConsoleMessages();
+ resetHistory();
emit finished(new Response(true));
}
+void Reset::resetHistory() {
+ // Clearing the history preserves the current history item, so set it to blank first.
+ page()->currentFrame()->setUrl(QUrl("about:blank"));
+ page()->history()->clear();
+}
+
View
3 src/Reset.h
@@ -8,5 +8,8 @@ class Reset : public Command {
public:
Reset(WebPage *page, QObject *parent = 0);
virtual void start(QStringList &arguments);
+
+ private:
+ void resetHistory();
};
View
1 src/find_command.h
@@ -24,3 +24,4 @@ CHECK_COMMAND(Headers)
CHECK_COMMAND(SetProxy)
CHECK_COMMAND(ConsoleMessages)
CHECK_COMMAND(RequestedUrl)
+CHECK_COMMAND(CurrentUrl)
View
2 src/webkit_server.js
@@ -140,7 +140,7 @@ window.WebKitServer = {
node.value += value[offset];
this.trigger(index, "keydown");
- this.keypress(index, false, false, false, false, 0, value[offset]);
+ this.keypress(index, false, false, false, false, 0, value.charCodeAt(offset));
this.trigger(index, "keyup");
}
View
2 src/webkit_server.pro
@@ -2,6 +2,7 @@ TEMPLATE = app
TARGET = webkit_server
DESTDIR = .
HEADERS = \
+ CurrentUrl.h \
RequestedUrl.h \
ConsoleMessages.h \
WebPage.h \
@@ -35,6 +36,7 @@ HEADERS = \
SetProxy.h \
SOURCES = \
+ CurrentUrl.cpp \
RequestedUrl.cpp \
ConsoleMessages.cpp \
main.cpp \

0 comments on commit 33b4e60

Please sign in to comment.