Moved Javascript code into a .js file that gets loaded into each page

This commit is contained in:
Joe Ferris 2011-02-25 22:32:22 -05:00
parent e0c4f6f57d
commit 54d7df3c4c
7 changed files with 43 additions and 29 deletions

View File

@ -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);

View File

@ -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;

View File

@ -1,6 +1,15 @@
#include "WebPage.h"
#include <QResource>
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() {

View File

@ -9,5 +9,9 @@ class WebPage : public QWebPage {
public slots:
bool shouldInterruptJavaScript();
void injectJavascriptHelpers();
private:
QString m_capybaraJavascript;
};

21
src/capybara.js Normal file
View File

@ -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);
}
};

View File

@ -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

5
src/webkit_server.qrc Normal file
View File

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>capybara.js</file>
</qresource>
</RCC>