Close new windows on reset

This commit is contained in:
Matthew Horan 2012-05-14 21:59:28 -04:00
parent e7ff6d4a18
commit 126411337e
10 changed files with 46 additions and 44 deletions

View File

@ -211,9 +211,9 @@ describe Capybara::Driver::Webkit do
subject.find("//*[contains(., 'hello')]").should be_empty subject.find("//*[contains(., 'hello')]").should be_empty
end end
it "has a location of 'about:blank' after reseting" do it "has a blank location after reseting" do
subject.reset! subject.reset!
subject.current_url.should == "about:blank" subject.current_url.should == ""
end end
it "raises an error for an invalid xpath query" do it "raises an error for an invalid xpath query" do
@ -1627,5 +1627,18 @@ describe Capybara::Driver::Webkit do
expect { subject.within_window('myWindowDoesNotExist') }. expect { subject.within_window('myWindowDoesNotExist') }.
to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError) to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError)
end end
it "has a number of window handles equal to the number of open windows" do
subject.window_handles.size.should == 1
subject.visit("/new_window")
subject.window_handles.size.should == 2
end
it "closes new windows on reset" do
subject.visit("/new_window")
last_handle = subject.window_handles.last
subject.reset!
subject.window_handles.should_not include(last_handle)
end
end end
end end

View File

@ -32,7 +32,7 @@ void Connection::commandReady(Command *command) {
void Connection::startCommand() { void Connection::startCommand() {
m_commandWaiting = false; m_commandWaiting = false;
if (m_pageSuccess) { if (m_pageSuccess) {
m_runningCommand = new PageLoadingCommand(m_queuedCommand, currentPage(), this); m_runningCommand = new PageLoadingCommand(m_queuedCommand, m_manager, this);
connect(m_runningCommand, SIGNAL(finished(Response *)), this, SLOT(finishCommand(Response *))); connect(m_runningCommand, SIGNAL(finished(Response *)), this, SLOT(finishCommand(Response *)));
m_runningCommand->start(); m_runningCommand->start();
} else { } else {

View File

@ -1,15 +1,16 @@
#include "PageLoadingCommand.h" #include "PageLoadingCommand.h"
#include "Command.h" #include "Command.h"
#include "WebPage.h" #include "WebPage.h"
#include "WebPageManager.h"
PageLoadingCommand::PageLoadingCommand(Command *command, WebPage *page, QObject *parent) : QObject(parent) { PageLoadingCommand::PageLoadingCommand(Command *command, WebPageManager *manager, QObject *parent) : QObject(parent) {
m_page = page; m_manager = manager;
m_command = command; m_command = command;
m_pageLoadingFromCommand = false; m_pageLoadingFromCommand = false;
m_pageSuccess = true; m_pageSuccess = true;
m_pendingResponse = NULL; m_pendingResponse = NULL;
connect(m_page, SIGNAL(loadStarted()), this, SLOT(pageLoadingFromCommand())); connect(m_manager, SIGNAL(loadStarted()), this, SLOT(pageLoadingFromCommand()));
connect(m_page, SIGNAL(pageFinished(bool)), this, SLOT(pendingLoadFinished(bool))); connect(m_manager, SIGNAL(pageFinished(bool)), this, SLOT(pendingLoadFinished(bool)));
} }
void PageLoadingCommand::start() { void PageLoadingCommand::start() {
@ -25,7 +26,7 @@ void PageLoadingCommand::pendingLoadFinished(bool success) {
if (m_pageSuccess) { if (m_pageSuccess) {
emit finished(m_pendingResponse); emit finished(m_pendingResponse);
} else { } else {
QString message = m_page->failureString(); QString message = m_manager->currentPage()->failureString();
emit finished(new Response(false, message)); emit finished(new Response(false, message));
} }
} }
@ -37,7 +38,7 @@ void PageLoadingCommand::pageLoadingFromCommand() {
} }
void PageLoadingCommand::commandFinished(Response *response) { void PageLoadingCommand::commandFinished(Response *response) {
disconnect(m_page, SIGNAL(loadStarted()), this, SLOT(pageLoadingFromCommand())); disconnect(m_manager, SIGNAL(loadStarted()), this, SLOT(pageLoadingFromCommand()));
m_command->deleteLater(); m_command->deleteLater();
if (m_pageLoadingFromCommand) if (m_pageLoadingFromCommand)
m_pendingResponse = response; m_pendingResponse = response;

View File

@ -3,7 +3,7 @@
class Command; class Command;
class Response; class Response;
class WebPage; class WebPageManager;
/* /*
* Decorates a Command by deferring the finished() signal until any pending * Decorates a Command by deferring the finished() signal until any pending
@ -19,7 +19,7 @@ class PageLoadingCommand : public QObject {
Q_OBJECT Q_OBJECT
public: public:
PageLoadingCommand(Command *command, WebPage *page, QObject *parent = 0); PageLoadingCommand(Command *command, WebPageManager *page, QObject *parent = 0);
void start(); void start();
public slots: public slots:
@ -31,7 +31,7 @@ class PageLoadingCommand : public QObject {
void finished(Response *response); void finished(Response *response);
private: private:
WebPage *m_page; WebPageManager *m_manager;
Command *m_command; Command *m_command;
Response *m_pendingResponse; Response *m_pendingResponse;
bool m_pageSuccess; bool m_pageSuccess;

View File

@ -1,8 +1,6 @@
#include "Reset.h" #include "Reset.h"
#include "WebPage.h" #include "WebPage.h"
#include "WebPageManager.h" #include "WebPageManager.h"
#include "NetworkAccessManager.h"
#include "NetworkCookieJar.h"
Reset::Reset(WebPageManager *manager, QStringList &arguments, QObject *parent) : Command(manager, arguments, parent) { Reset::Reset(WebPageManager *manager, QStringList &arguments, QObject *parent) : Command(manager, arguments, parent) {
} }
@ -10,21 +8,8 @@ Reset::Reset(WebPageManager *manager, QStringList &arguments, QObject *parent) :
void Reset::start() { void Reset::start() {
page()->triggerAction(QWebPage::Stop); page()->triggerAction(QWebPage::Stop);
NetworkAccessManager* networkAccessManager = qobject_cast<NetworkAccessManager*>(page()->networkAccessManager()); manager()->reset();
networkAccessManager->setCookieJar(new NetworkCookieJar());
networkAccessManager->resetHeaders();
page()->setUserAgent(NULL);
page()->resetResponseHeaders();
page()->resetConsoleMessages();
page()->resetWindowSize();
resetHistory();
emit finished(new Response(true)); 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 File

@ -6,8 +6,5 @@ class Reset : public Command {
public: public:
Reset(WebPageManager *, QStringList &arguments, QObject *parent = 0); Reset(WebPageManager *, QStringList &arguments, QObject *parent = 0);
virtual void start(); virtual void start();
private:
void resetHistory();
}; };

View File

@ -13,6 +13,7 @@ WebPage::WebPage(WebPageManager *manager, QObject *parent) : QWebPage(parent) {
m_loading = false; m_loading = false;
m_manager = manager; m_manager = manager;
m_uuid = QUuid::createUuid().toString(); m_uuid = QUuid::createUuid().toString();
m_lastStatus = 0;
setForwardUnsupportedContent(true); setForwardUnsupportedContent(true);
loadJavascript(); loadJavascript();
@ -28,6 +29,8 @@ WebPage::WebPage(WebPageManager *manager, QObject *parent) : QWebPage(parent) {
this, SLOT(handleUnsupportedContent(QNetworkReply*))); this, SLOT(handleUnsupportedContent(QNetworkReply*)));
connect(this, SIGNAL(pageFinished(bool)), connect(this, SIGNAL(pageFinished(bool)),
m_manager, SLOT(emitPageFinished(bool))); m_manager, SLOT(emitPageFinished(bool)));
connect(this, SIGNAL(loadStarted()),
m_manager, SLOT(emitLoadStarted()));
resetWindowSize(); resetWindowSize();
settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, true); settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, true);
@ -39,8 +42,8 @@ void WebPage::resetWindowSize() {
} }
void WebPage::setCustomNetworkAccessManager() { void WebPage::setCustomNetworkAccessManager() {
NetworkAccessManager *manager = new NetworkAccessManager(); NetworkAccessManager *manager = new NetworkAccessManager(this);
manager->setCookieJar(new NetworkCookieJar()); manager->setCookieJar(new NetworkCookieJar(this));
this->setNetworkAccessManager(manager); this->setNetworkAccessManager(manager);
connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *))); connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));
connect(manager, SIGNAL(sslErrors(QNetworkReply *, QList<QSslError>)), connect(manager, SIGNAL(sslErrors(QNetworkReply *, QList<QSslError>)),
@ -229,15 +232,6 @@ int WebPage::getLastStatus() {
return m_lastStatus; return m_lastStatus;
} }
void WebPage::resetResponseHeaders() {
m_lastStatus = 0;
m_pageHeaders = QString();
}
void WebPage::resetConsoleMessages() {
m_consoleMessages.clear();
}
QString WebPage::pageHeaders() { QString WebPage::pageHeaders() {
return m_pageHeaders; return m_pageHeaders;
} }

View File

@ -15,13 +15,11 @@ class WebPage : public QWebPage {
QString userAgentForUrl(const QUrl &url ) const; QString userAgentForUrl(const QUrl &url ) const;
void setUserAgent(QString userAgent); void setUserAgent(QString userAgent);
int getLastStatus(); int getLastStatus();
void resetResponseHeaders();
void setCustomNetworkAccessManager(); void setCustomNetworkAccessManager();
bool render(const QString &fileName); bool render(const QString &fileName);
virtual bool extension (Extension extension, const ExtensionOption *option=0, ExtensionReturn *output=0); virtual bool extension (Extension extension, const ExtensionOption *option=0, ExtensionReturn *output=0);
void setSkipImageLoading(bool skip); void setSkipImageLoading(bool skip);
QString consoleMessages(); QString consoleMessages();
void resetConsoleMessages();
void resetWindowSize(); void resetWindowSize();
QWebPage *createWindow(WebWindowType type); QWebPage *createWindow(WebWindowType type);
QString uuid(); QString uuid();

View File

@ -34,6 +34,11 @@ void WebPageManager::emitPageFinished(bool success) {
emit pageFinished(success); emit pageFinished(success);
} }
void WebPageManager::emitLoadStarted() {
if (currentPage() == sender())
emit loadStarted();
}
void WebPageManager::setIgnoreSslErrors(bool value) { void WebPageManager::setIgnoreSslErrors(bool value) {
m_ignoreSslErrors = value; m_ignoreSslErrors = value;
} }
@ -41,3 +46,9 @@ void WebPageManager::setIgnoreSslErrors(bool value) {
bool WebPageManager::ignoreSslErrors() { bool WebPageManager::ignoreSslErrors() {
return m_ignoreSslErrors; return m_ignoreSslErrors;
} }
void WebPageManager::reset() {
m_pages.first()->deleteLater();
m_pages.clear();
createPage(this)->setFocus();
}

View File

@ -17,12 +17,15 @@ class WebPageManager : public QObject {
WebPage *createPage(QObject *parent); WebPage *createPage(QObject *parent);
void setIgnoreSslErrors(bool); void setIgnoreSslErrors(bool);
bool ignoreSslErrors(); bool ignoreSslErrors();
void reset();
public slots: public slots:
void emitPageFinished(bool); void emitPageFinished(bool);
void emitLoadStarted();
signals: signals:
void pageFinished(bool); void pageFinished(bool);
void loadStarted();
private: private:
QList<WebPage *> m_pages; QList<WebPage *> m_pages;