Skip to content

Commit

Permalink
Merge branch 'http-header' of https://github.com/os0x/capybara-webkit
Browse files Browse the repository at this point in the history
  • Loading branch information
mike-burns committed Jun 29, 2011
2 parents 7d1d2e4 + 818f654 commit d40a1d0
Show file tree
Hide file tree
Showing 13 changed files with 156 additions and 2 deletions.
4 changes: 4 additions & 0 deletions lib/capybara/driver/webkit.rb
Expand Up @@ -36,6 +36,10 @@ def body
source
end

def header(key, value)
browser.header(key, value)
end

def execute_script(script)
browser.execute_script script
end
Expand Down
4 changes: 4 additions & 0 deletions lib/capybara/driver/webkit/browser.rb
Expand Up @@ -14,6 +14,10 @@ def visit(url)
command "Visit", url
end

def header(key, value)
command("Header", key, value)
end

def find(query)
command("Find", query).split(",")
end
Expand Down
53 changes: 53 additions & 0 deletions spec/driver_spec.rb
Expand Up @@ -687,4 +687,57 @@ def wait_for_error_to_complete
subject.find("//p").first.text.should == "success"
end
end

context "custom header" do
before(:all) do
@app = lambda do |env|
body = <<-HTML
<html><body>
<p id="user-agent">#{env['HTTP_USER_AGENT']}</p>
<p id="x-capybara-webkit-header">#{env['HTTP_X_CAPYBARA_WEBKIT_HEADER']}</p>
<p id="accept">#{env['HTTP_ACCEPT']}</p>
<a href="/">/</a>
</body></html>
HTML
[200,
{ 'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s },
[body]]
end
end

before do
subject.header('user-agent', 'capybara-webkit/custom-user-agent')
subject.header('x-capybara-webkit-header', 'x-capybara-webkit-header')
subject.header('accept', 'text/html')
subject.visit('/')
end

it "can set user_agent" do
subject.find('id("user-agent")').first.text.should == 'capybara-webkit/custom-user-agent'
subject.evaluate_script('navigator.userAgent').should == 'capybara-webkit/custom-user-agent'
end

it "keep user_agent in next page" do
subject.find("//a").first.click
subject.find('id("user-agent")').first.text.should == 'capybara-webkit/custom-user-agent'
subject.evaluate_script('navigator.userAgent').should == 'capybara-webkit/custom-user-agent'
end

it "can set custom header" do
subject.find('id("x-capybara-webkit-header")').first.text.should == 'x-capybara-webkit-header'
end

it "can set Accept header" do
subject.find('id("accept")').first.text.should == 'text/html'
end

it "can reset all custom header" do
subject.reset!
subject.visit('/')
subject.find('id("user-agent")').first.text.should_not == 'capybara-webkit/custom-user-agent'
subject.evaluate_script('navigator.userAgent').should_not == 'capybara-webkit/custom-user-agent'
subject.find('id("x-capybara-webkit-header")').first.text.should be_empty
subject.find('id("accept")').first.text.should_not == 'text/html'
end
end
end
1 change: 1 addition & 0 deletions src/Connection.cpp
Expand Up @@ -10,6 +10,7 @@
#include "Evaluate.h"
#include "Execute.h"
#include "FrameFocus.h"
#include "Header.h"

#include <QTcpSocket>
#include <iostream>
Expand Down
18 changes: 18 additions & 0 deletions src/Header.cpp
@@ -0,0 +1,18 @@
#include "Header.h"
#include "WebPage.h"
#include "NetworkAccessManager.h"

Header::Header(WebPage *page, QObject *parent) : Command(page, parent) {
}

void Header::start(QStringList &arguments) {
QString key = arguments[0];
QString value = arguments[1];
NetworkAccessManager* networkAccessManager = qobject_cast<NetworkAccessManager*>(page()->networkAccessManager());
if (key.toLower().replace("-", "_") == "user_agent") {
page()->setUserAgent(value);
} else {
networkAccessManager->addHeader(key, value);
}
emit finished(new Response(true));
}
11 changes: 11 additions & 0 deletions src/Header.h
@@ -0,0 +1,11 @@
#include "Command.h"

class WebPage;

class Header : public Command {
Q_OBJECT

public:
Header(WebPage *page, QObject *parent = 0);
virtual void start(QStringList &arguments);
};
22 changes: 22 additions & 0 deletions src/NetworkAccessManager.cpp
@@ -0,0 +1,22 @@
#include "NetworkAccessManager.h"
#include "WebPage.h"
#include <iostream>


NetworkAccessManager::NetworkAccessManager(QObject *parent):QNetworkAccessManager(parent) {
}

QNetworkReply* NetworkAccessManager::createRequest(QNetworkAccessManager::Operation oparation, const QNetworkRequest &request, QIODevice * outgoingData = 0) {
QNetworkRequest new_request(request);
QHashIterator<QString, QString> item(m_headers);
while (item.hasNext()) {
item.next();
new_request.setRawHeader(item.key().toAscii(), item.value().toAscii());
}
return QNetworkAccessManager::createRequest(oparation, new_request, outgoingData);
};

void NetworkAccessManager::addHeader(QString key, QString value) {
m_headers.insert(key, value);
};

18 changes: 18 additions & 0 deletions src/NetworkAccessManager.h
@@ -0,0 +1,18 @@
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>

class NetworkAccessManager : public QNetworkAccessManager {

Q_OBJECT

public:
NetworkAccessManager(QObject *parent = 0);
void addHeader(QString key, QString value);

protected:
QNetworkReply* createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice * outgoingData);

private:
QHash<QString, QString> m_headers;
};
3 changes: 3 additions & 0 deletions src/Reset.cpp
@@ -1,5 +1,6 @@
#include "Reset.h"
#include "WebPage.h"
#include "NetworkAccessManager.h"

Reset::Reset(WebPage *page, QObject *parent) : Command(page, parent) {
}
Expand All @@ -10,6 +11,8 @@ void Reset::start(QStringList &arguments) {
page()->triggerAction(QWebPage::Stop);
page()->currentFrame()->setHtml("<html><body></body></html>");
page()->networkAccessManager()->setCookieJar(new QNetworkCookieJar());
page()->setNetworkAccessManager(new NetworkAccessManager());
page()->setUserAgent(NULL);
emit finished(new Response(true));
}

16 changes: 16 additions & 0 deletions src/WebPage.cpp
@@ -1,5 +1,6 @@
#include "WebPage.h"
#include "JavascriptInvocation.h"
#include "NetworkAccessManager.h"
#include <QResource>
#include <iostream>

Expand All @@ -15,12 +16,27 @@ WebPage::WebPage(QObject *parent) : QWebPage(parent) {
m_capybaraJavascript = javascriptString;
}
m_loading = false;

this->setNetworkAccessManager(new NetworkAccessManager());

connect(this, SIGNAL(loadStarted()), this, SLOT(loadStarted()));
connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool)));
connect(this, SIGNAL(frameCreated(QWebFrame *)),
this, SLOT(frameCreated(QWebFrame *)));
}

QString WebPage::userAgentForUrl(const QUrl &url ) const {
if (!m_userAgent.isEmpty()) {
return m_userAgent;
} else {
return QWebPage::userAgentForUrl(url);
}
}

void WebPage::setUserAgent(QString userAgent) {
m_userAgent = userAgent;
}

void WebPage::frameCreated(QWebFrame * frame) {
connect(frame, SIGNAL(javaScriptWindowObjectCleared()),
this, SLOT(injectJavascriptHelpers()));
Expand Down
3 changes: 3 additions & 0 deletions src/WebPage.h
Expand Up @@ -8,6 +8,8 @@ class WebPage : public QWebPage {
QVariant invokeCapybaraFunction(const char *name, QStringList &arguments);
QVariant invokeCapybaraFunction(QString &name, QStringList &arguments);
QString failureString();
QString userAgentForUrl(const QUrl &url ) const;
void setUserAgent(QString userAgent);

public slots:
bool shouldInterruptJavaScript();
Expand All @@ -25,6 +27,7 @@ class WebPage : public QWebPage {

private:
QString m_capybaraJavascript;
QString m_userAgent;
bool m_loading;
};

1 change: 1 addition & 0 deletions src/find_command.h
Expand Up @@ -12,3 +12,4 @@ CHECK_COMMAND(Source)
CHECK_COMMAND(Evaluate)
CHECK_COMMAND(Execute)
CHECK_COMMAND(FrameFocus)
CHECK_COMMAND(Header)
4 changes: 2 additions & 2 deletions src/webkit_server.pro
@@ -1,8 +1,8 @@
TEMPLATE = app
TARGET = webkit_server
DESTDIR = .
HEADERS = WebPage.h Server.h Connection.h Command.h Visit.h Find.h Reset.h Node.h JavascriptInvocation.h Url.h Source.h Evaluate.h Execute.h FrameFocus.h Response.h
SOURCES = main.cpp WebPage.cpp Server.cpp Connection.cpp Command.cpp Visit.cpp Find.cpp Reset.cpp Node.cpp JavascriptInvocation.cpp Url.cpp Source.cpp Evaluate.cpp Execute.cpp FrameFocus.cpp Response.cpp
HEADERS = WebPage.h Server.h Connection.h Command.h Visit.h Find.h Reset.h Node.h JavascriptInvocation.h Url.h Source.h Evaluate.h Execute.h FrameFocus.h Response.h NetworkAccessManager.h Header.h
SOURCES = main.cpp WebPage.cpp Server.cpp Connection.cpp Command.cpp Visit.cpp Find.cpp Reset.cpp Node.cpp JavascriptInvocation.cpp Url.cpp Source.cpp Evaluate.cpp Execute.cpp FrameFocus.cpp Response.cpp NetworkAccessManager.cpp Header.cpp
RESOURCES = webkit_server.qrc
QT += network webkit
CONFIG += console
Expand Down

0 comments on commit d40a1d0

Please sign in to comment.