Close new windows on reset
This commit is contained in:
parent
e7ff6d4a18
commit
126411337e
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -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();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue