From 4ca10d29ed9b7d45de404cbcc6de1dc2b956fefd Mon Sep 17 00:00:00 2001 From: Joe Ferris Date: Fri, 4 May 2012 13:56:21 -0400 Subject: [PATCH] Switch ignore ssl from a command-line flag to a server command --- lib/capybara/driver/webkit.rb | 4 ++-- lib/capybara/driver/webkit/browser.rb | 6 ++++-- spec/browser_spec.rb | 2 +- src/CommandFactory.cpp | 1 + src/IgnoreSslErrors.cpp | 12 ++++++++++++ src/IgnoreSslErrors.h | 12 ++++++++++++ src/Server.cpp | 3 +-- src/Server.h | 2 +- src/WebPage.cpp | 15 ++++++--------- src/WebPage.h | 5 ++--- src/find_command.h | 1 + src/main.cpp | 3 +-- src/webkit_server.pro | 2 ++ 13 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 src/IgnoreSslErrors.cpp create mode 100644 src/IgnoreSslErrors.h diff --git a/lib/capybara/driver/webkit.rb b/lib/capybara/driver/webkit.rb index 6faef67..042b43b 100644 --- a/lib/capybara/driver/webkit.rb +++ b/lib/capybara/driver/webkit.rb @@ -22,8 +22,8 @@ class Capybara::Driver::Webkit @options = options @rack_server = Capybara::Server.new(@app) @rack_server.boot if Capybara.run_server - @browser = options[:browser] || Browser.new( - :ignore_ssl_errors => options[:ignore_ssl_errors]) + @browser = options[:browser] || Browser.new + @browser.ignore_ssl_errors if options[:ignore_ssl_errors] end def current_url diff --git a/lib/capybara/driver/webkit/browser.rb b/lib/capybara/driver/webkit/browser.rb index ec43ba1..1b80e50 100644 --- a/lib/capybara/driver/webkit/browser.rb +++ b/lib/capybara/driver/webkit/browser.rb @@ -12,7 +12,6 @@ class Capybara::Driver::Webkit @stdout = options.has_key?(:stdout) ? options[:stdout] : $stdout - @ignore_ssl_errors = options[:ignore_ssl_errors] start_server connect end @@ -84,6 +83,10 @@ class Capybara::Driver::Webkit end end + def ignore_ssl_errors + command("IgnoreSslErrors") + end + def command(name, *args) @socket.puts name @socket.puts args.size @@ -170,7 +173,6 @@ class Capybara::Driver::Webkit def server_pipe_and_pid(server_path) cmdline = [server_path] - cmdline << "--ignore-ssl-errors" if @ignore_ssl_errors pipe = IO.popen(cmdline.join(" ")) [pipe, pipe.pid] end diff --git a/spec/browser_spec.rb b/spec/browser_spec.rb index 783b566..28bea01 100644 --- a/spec/browser_spec.rb +++ b/spec/browser_spec.rb @@ -9,7 +9,7 @@ describe Capybara::Driver::Webkit::Browser do let(:browser) { Capybara::Driver::Webkit::Browser.new } let(:browser_ignore_ssl_err) { - Capybara::Driver::Webkit::Browser.new(:ignore_ssl_errors => true) + Capybara::Driver::Webkit::Browser.new.tap { |browser| browser.ignore_ssl_errors } } describe '#server_port' do diff --git a/src/CommandFactory.cpp b/src/CommandFactory.cpp index 9e2ec24..6b420fc 100644 --- a/src/CommandFactory.cpp +++ b/src/CommandFactory.cpp @@ -23,6 +23,7 @@ #include "RequestedUrl.h" #include "CurrentUrl.h" #include "ResizeWindow.h" +#include "IgnoreSslErrors.h" CommandFactory::CommandFactory(WebPage *page, QObject *parent) : QObject(parent) { m_page = page; diff --git a/src/IgnoreSslErrors.cpp b/src/IgnoreSslErrors.cpp new file mode 100644 index 0000000..a7fb2fc --- /dev/null +++ b/src/IgnoreSslErrors.cpp @@ -0,0 +1,12 @@ +#include "IgnoreSslErrors.h" +#include "WebPage.h" + +IgnoreSslErrors::IgnoreSslErrors(WebPage *page, QStringList &arguments, QObject *parent) : + Command(page, arguments, parent) { +} + +void IgnoreSslErrors::start() { + page()->ignoreSslErrors(); + emit finished(new Response(true)); +} + diff --git a/src/IgnoreSslErrors.h b/src/IgnoreSslErrors.h new file mode 100644 index 0000000..898b500 --- /dev/null +++ b/src/IgnoreSslErrors.h @@ -0,0 +1,12 @@ +#include "Command.h" + +class WebPage; + +class IgnoreSslErrors : public Command { + Q_OBJECT + + public: + IgnoreSslErrors(WebPage *page, QStringList &arguments, QObject *parent = 0); + virtual void start(); +}; + diff --git a/src/Server.cpp b/src/Server.cpp index 401a2ee..39bfa96 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -4,10 +4,9 @@ #include -Server::Server(QObject *parent, bool ignoreSslErrors) : QObject(parent) { +Server::Server(QObject *parent) : QObject(parent) { m_tcp_server = new QTcpServer(this); m_page = new WebPage(this); - m_page->setIgnoreSslErrors(ignoreSslErrors); } bool Server::start() { diff --git a/src/Server.h b/src/Server.h index 677097f..41a2a8d 100644 --- a/src/Server.h +++ b/src/Server.h @@ -7,7 +7,7 @@ class Server : public QObject { Q_OBJECT public: - Server(QObject *parent, bool ignoreSslErrors); + Server(QObject *parent); bool start(); quint16 server_port() const; diff --git a/src/WebPage.cpp b/src/WebPage.cpp index 62aa6ea..5de5b13 100644 --- a/src/WebPage.cpp +++ b/src/WebPage.cpp @@ -12,6 +12,7 @@ WebPage::WebPage(QObject *parent) : QWebPage(parent) { setUserStylesheet(); m_loading = false; + m_ignoreSslErrors = false; this->setCustomNetworkAccessManager(); connect(this, SIGNAL(loadStarted()), this, SLOT(loadStarted())); @@ -33,7 +34,8 @@ void WebPage::setCustomNetworkAccessManager() { manager->setCookieJar(new NetworkCookieJar()); this->setNetworkAccessManager(manager); connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *))); - connect(manager, SIGNAL(sslErrors(QNetworkReply *, QList)), this, SLOT(ignoreSslErrors(QNetworkReply *, QList))); + connect(manager, SIGNAL(sslErrors(QNetworkReply *, QList)), + this, SLOT(handleSslErrorsForReply(QNetworkReply *, QList))); } void WebPage::loadJavascript() { @@ -205,20 +207,15 @@ void WebPage::replyFinished(QNetworkReply *reply) { } } -void WebPage::ignoreSslErrors(QNetworkReply *reply, const QList &errors) { +void WebPage::handleSslErrorsForReply(QNetworkReply *reply, const QList &errors) { if (m_ignoreSslErrors) reply->ignoreSslErrors(errors); } -void WebPage::setIgnoreSslErrors(bool ignore) { - m_ignoreSslErrors = ignore; +void WebPage::ignoreSslErrors() { + m_ignoreSslErrors = true; } -bool WebPage::ignoreSslErrors() { - return m_ignoreSslErrors; -} - - int WebPage::getLastStatus() { return m_lastStatus; } diff --git a/src/WebPage.h b/src/WebPage.h index 8993c57..d47744b 100644 --- a/src/WebPage.h +++ b/src/WebPage.h @@ -15,8 +15,7 @@ class WebPage : public QWebPage { void setCustomNetworkAccessManager(); bool render(const QString &fileName); virtual bool extension (Extension extension, const ExtensionOption *option=0, ExtensionReturn *output=0); - void setIgnoreSslErrors(bool ignore); - bool ignoreSslErrors(); + void ignoreSslErrors(); QString consoleMessages(); void resetConsoleMessages(); void resetWindowSize(); @@ -30,7 +29,7 @@ class WebPage : public QWebPage { QString pageHeaders(); void frameCreated(QWebFrame *); void replyFinished(QNetworkReply *reply); - void ignoreSslErrors(QNetworkReply *reply, const QList &); + void handleSslErrorsForReply(QNetworkReply *reply, const QList &); void handleUnsupportedContent(QNetworkReply *reply); signals: diff --git a/src/find_command.h b/src/find_command.h index 63f37cc..6fbd9aa 100644 --- a/src/find_command.h +++ b/src/find_command.h @@ -26,3 +26,4 @@ CHECK_COMMAND(ConsoleMessages) CHECK_COMMAND(RequestedUrl) CHECK_COMMAND(CurrentUrl) CHECK_COMMAND(ResizeWindow) +CHECK_COMMAND(IgnoreSslErrors) diff --git a/src/main.cpp b/src/main.cpp index 7f4eb26..2d97dd5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,9 +19,8 @@ int main(int argc, char **argv) { app.setOrganizationDomain("thoughtbot.com"); QStringList args = app.arguments(); - bool ignoreSslErrors = args.contains("--ignore-ssl-errors"); - Server server(0, ignoreSslErrors); + Server server(0); if (server.start()) { std::cout << "Capybara-webkit server started, listening on port: " << server.server_port() << std::endl; diff --git a/src/webkit_server.pro b/src/webkit_server.pro index 0b74e43..a2c47a2 100644 --- a/src/webkit_server.pro +++ b/src/webkit_server.pro @@ -2,6 +2,7 @@ TEMPLATE = app TARGET = webkit_server DESTDIR = . HEADERS = \ + IgnoreSslErrors.h \ ResizeWindow.h \ CurrentUrl.h \ RequestedUrl.h \ @@ -39,6 +40,7 @@ HEADERS = \ PageLoadingCommand.h \ SOURCES = \ + IgnoreSslErrors.cpp \ ResizeWindow.cpp \ CurrentUrl.cpp \ RequestedUrl.cpp \