diff --git a/src/Attribute.cpp b/src/Attribute.cpp index 7c4d1fe9..70f15de6 100644 --- a/src/Attribute.cpp +++ b/src/Attribute.cpp @@ -9,12 +9,7 @@ void Attribute::receivedArgument(const char *argument) { if (m_args.length() == 2) { QString nodeIndex = m_args[0]; QString attributeName = m_args[1]; - QString javascript = QString("\ - (function () {\ - var node = window.__capybara_nodes[") + nodeIndex + "];\ - return node.getAttribute('" + attributeName + "');\ - })();\ - "; + QString javascript = QString("Capybara.attribute(" + nodeIndex + ", \"" + attributeName + "\")"); QVariant result = page()->mainFrame()->evaluateJavaScript(javascript); QString attributeValue = result.toString(); emit finished(true, attributeValue); diff --git a/src/Find.cpp b/src/Find.cpp index 4e9ccac5..14df77d5 100644 --- a/src/Find.cpp +++ b/src/Find.cpp @@ -8,28 +8,7 @@ Find::Find(WebPage *page, QObject *parent) : Command(page, parent) { void Find::receivedArgument(const char *xpath) { std::cout << "<< Running query: " << xpath << std::endl; - QString javascript = QString("\ - (function () {\ - if (!window.__capybara_index) {\ - window.__capybara_index = 0;\ - window.__capybara_nodes = {};\ - }\ - var iterator = document.evaluate(\"") + xpath + "\",\ - document,\ - null,\ - XPathResult.ORDERED_NODE_ITERATOR_TYPE,\ - null);\ - var node;\ - var results = [];\ - while (node = iterator.iterateNext()) {\ - window.__capybara_index++;\ - window.__capybara_nodes[window.__capybara_index] = node;\ - results.push(window.__capybara_index);\ - }\ - return results;\ - })()\ - "; - + QString javascript = QString("Capybara.find(\"") + xpath + "\")"; std::cout << "<< Javascript to execute:" << std::endl; std::cout << javascript.toAscii().data() << std::endl; diff --git a/src/WebPage.cpp b/src/WebPage.cpp index b9254cd9..1bb6393b 100644 --- a/src/WebPage.cpp +++ b/src/WebPage.cpp @@ -1,6 +1,15 @@ #include "WebPage.h" +#include WebPage::WebPage(QObject *parent) : QWebPage(parent) { + connect(mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), + this, SLOT(injectJavascriptHelpers())); + QResource javascript(":/capybara.js"); + m_capybaraJavascript = QString((const char *) javascript.data()); +} + +void WebPage::injectJavascriptHelpers() { + mainFrame()->evaluateJavaScript(m_capybaraJavascript); } bool WebPage::shouldInterruptJavaScript() { diff --git a/src/WebPage.h b/src/WebPage.h index 27c3501e..9c277367 100644 --- a/src/WebPage.h +++ b/src/WebPage.h @@ -9,5 +9,9 @@ class WebPage : public QWebPage { public slots: bool shouldInterruptJavaScript(); + void injectJavascriptHelpers(); + + private: + QString m_capybaraJavascript; }; diff --git a/src/capybara.js b/src/capybara.js new file mode 100644 index 00000000..c299c5ee --- /dev/null +++ b/src/capybara.js @@ -0,0 +1,21 @@ +Capybara = { + nextIndex: 0, + nodes: {}, + + find: function (xpath) { + var iterator = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); + var node; + var results = []; + while (node = iterator.iterateNext()) { + this.nextIndex++; + this.nodes[this.nextIndex] = node; + results.push(this.nextIndex); + } + return results; + }, + + attribute: function (index, name) { + return this.nodes[index].getAttribute(name); + } +}; + diff --git a/src/webkit_server.pro b/src/webkit_server.pro index 58c198c7..cc52059d 100644 --- a/src/webkit_server.pro +++ b/src/webkit_server.pro @@ -3,6 +3,7 @@ TARGET = webkit_server DESTDIR = . HEADERS = WebPage.h Server.h Connection.h Command.h Visit.h Find.h Reset.h Attribute.h SOURCES = main.cpp WebPage.cpp Server.cpp Connection.cpp Command.cpp Visit.cpp Find.cpp Reset.cpp Attribute.cpp +RESOURCES = webkit_server.qrc QT += network webkit -CONFIG += console staticlib +CONFIG += console diff --git a/src/webkit_server.qrc b/src/webkit_server.qrc new file mode 100644 index 00000000..88efd00d --- /dev/null +++ b/src/webkit_server.qrc @@ -0,0 +1,5 @@ + + + capybara.js + +