Commit e095b38d authored by Stefano Crocco's avatar Stefano Crocco Committed by David Faure
Browse files

Remove KonqRun

KonqRun is replaced by the UrlLoader class which offers similar
functionality
parent c4238fd7
......@@ -29,6 +29,7 @@ target_link_libraries(KF5Konq
KF5::CoreAddons
KF5::Service
KF5::Parts
Qt5::WebEngineWidgets
PRIVATE
KF5::Bookmarks
KF5::I18n
......
......@@ -50,7 +50,6 @@ set(konqueror_KDEINIT_SRCS
konqdebug.cpp
konqguiclients.cpp
konqbookmarkmenu.cpp
konqrun.cpp
konqview.cpp
konqviewmanager.cpp
konqmouseeventfilter.cpp
......@@ -73,7 +72,6 @@ set(konqueror_KDEINIT_SRCS
konqmainwindowfactory.cpp
konqextensionmanager.cpp
konqbookmarkbar.cpp
konqsettings.cpp
KonquerorAdaptor.cpp
KonqMainWindowAdaptor.cpp
KonqViewAdaptor.cpp
......@@ -85,6 +83,8 @@ set(konqueror_KDEINIT_SRCS
konqstatusbarmessagelabel.cpp
konqurl.cpp
konqbrowserinterface.cpp
urlloader.cpp
konqsettings.cpp
)
kconfig_add_kcfg_files(konqueror_KDEINIT_SRCS konqsettingsxt.kcfgc)
......
......@@ -9,6 +9,8 @@
#include "konqbrowserinterface.h"
#include "konqmainwindow.h"
#include "urlloader.h"
#include "konqview.h"
KonqBrowserInterface::KonqBrowserInterface(KonqMainWindow *mainWindow, KParts::ReadOnlyPart *part):
KParts::BrowserInterface(mainWindow), m_mainWindow(mainWindow), m_part(part)
......@@ -20,3 +22,13 @@ void KonqBrowserInterface::toggleCompleteFullScreen(bool on)
m_mainWindow->toggleCompleteFullScreen(on);
}
// void KonqBrowserInterface::openUrl(const QUrl &url, const QString& mimetype, const QString &suggestedFileName)
// {
// KParts::ReadOnlyPart *part = m_mainWindow->m_currentView ? m_mainWindow->m_currentView->part() : nullptr;
// m_mainWindow->m_urlLoader->openUrl(part, url, mimetype, suggestedFileName);
// }
QString KonqBrowserInterface::partForLocalFile(const QString& path)
{
return UrlLoader::partForLocalFile(path);
}
......@@ -33,6 +33,8 @@ public:
public slots:
void toggleCompleteFullScreen(bool on);
// void openUrl(const QUrl &url, const QString &mimetype, const QString &suggestedFileName=QString());
QString partForLocalFile(const QString &path);
private:
KonqMainWindow *m_mainWindow;
......
......@@ -117,16 +117,13 @@ KonqViewFactory KonqFactory::createView(const QString &serviceType,
// Look for this service
if (!serviceName.isEmpty()) {
KService::List::const_iterator it = offers.constBegin();
for (; it != offers.constEnd() && !service; ++it) {
if ((*it)->desktopEntryName() == serviceName) {
qCDebug(KONQUEROR_LOG) << "Found requested service" << serviceName;
service = *it;
}
}
auto it = std::find_if(offers.constBegin(), offers.constEnd(), [serviceName](KService::Ptr s){return s->desktopEntryName() == serviceName;});
qCDebug(KONQUEROR_LOG) << "Found requested service" << serviceName;
service = *it;
}
KonqViewFactory viewFactory;
if (service) {
qCDebug(KONQUEROR_LOG) << "Trying to open lib for requested service " << service->desktopEntryName();
viewFactory = tryLoadingService(service);
......@@ -134,16 +131,17 @@ KonqViewFactory KonqFactory::createView(const QString &serviceType,
// When looking for konq_sidebartng or konq_aboutpage, we don't want to end up
// with khtml or another Browser/View part in case of an error...
} else {
KService::List::Iterator it = offers.begin();
for (; viewFactory.isNull() /* exit as soon as we get one */ && it != offers.end(); ++it) {
service = (*it);
for (KService::Ptr offer : offers) {
// Allowed as default ?
QVariant prop = service->property(QStringLiteral("X-KDE-BrowserView-AllowAsDefault"));
qCDebug(KONQUEROR_LOG) << service->desktopEntryName() << " : X-KDE-BrowserView-AllowAsDefault is valid : " << prop.isValid();
QVariant prop = offer ->property(QStringLiteral("X-KDE-BrowserView-AllowAsDefault"));
qCDebug(KONQUEROR_LOG) << offer ->desktopEntryName() << " : X-KDE-BrowserView-AllowAsDefault is valid : " << prop.isValid();
if (!prop.isValid() || prop.toBool()) { // defaults to true
//qCDebug(KONQUEROR_LOG) << "Trying to open lib for service " << service->name();
viewFactory = tryLoadingService(service);
// If this works, we exit the loop.
viewFactory = tryLoadingService(offer);
if (!viewFactory.isNull()) {
service = offer;
break;
}
} else {
qCDebug(KONQUEROR_LOG) << "Not allowed as default " << service->desktopEntryName();
}
......
......@@ -21,7 +21,6 @@
#include "KonqMainWindowAdaptor.h"
#include "KonquerorAdaptor.h"
#include "konqview.h"
#include "konqrun.h"
#include "konqmisc.h"
#include "konqviewmanager.h"
#include "konqframestatusbar.h"
......@@ -39,6 +38,8 @@
#include <config-konqueror.h>
#include <kstringhandler.h>
#include "konqurl.h"
#include "konqbrowserinterface.h"
#include "urlloader.h"
#include <konq_events.h>
#include <konqpixmapprovider.h>
......@@ -146,6 +147,9 @@
#include <KProtocolManager>
#include <QMetaObject>
#include <QMetaMethod>
template class QList<QPixmap *>;
template class QList<KToggleAction *>;
......@@ -522,11 +526,9 @@ void KonqMainWindow::openUrl(KonqView *_view, const QUrl &_url,
QUrl url(_url);
QString mimeType(_mimeType);
KonqOpenURLRequest req(_req);
if (m_currentView && url.isLocalFile() && m_currentView->isWebEngineView()) {
//The value of the entry doesn't matter: what's important is that the key exists
req.args.metaData().insert("urlRequestedByApp", QString()) ;
}
qDebug() << "VIEW" << _view;
//TODO Remove KonqRun: what's the difference between mimeType and req.args.mimeType? which should be used by UrlLoader?
if (mimeType.isEmpty()) {
mimeType = req.args.mimeType();
}
......@@ -540,10 +542,6 @@ void KonqMainWindow::openUrl(KonqView *_view, const QUrl &_url,
url = KParts::BrowserRun::makeErrorUrl(KIO::ERR_UNSUPPORTED_PROTOCOL, url.scheme(), url);
}
if (KonqUrl::isKonqBlank(url) || url.scheme() == QLatin1String("error")) {
mimeType = QStringLiteral("text/html");
}
const QString nameFilter = detectNameFilter(url);
if (!nameFilter.isEmpty()) {
req.nameFilter = nameFilter;
......@@ -556,7 +554,65 @@ void KonqMainWindow::openUrl(KonqView *_view, const QUrl &_url,
}
KonqView *view = _view;
qDebug() << "ORIGINAL VIEW" << view << "VIEW URL" << (view ? view->url() : QUrl());
UrlLoader *loader = new UrlLoader(this, view, url, mimeType, req, trustedSource, false);
connect(loader, &UrlLoader::finished, this, &KonqMainWindow::urlLoaderFinished);
loader->start();
// The URL should be opened in a new tab. Let's create the tab right away,
// it gives faster user feedback (#163628). For a short while (kde-4.1-beta1)
// I removed this entire block so that we wouldn't end up with a useless tab when
// launching an external application for this mimetype. But user feedback
// in all cases is more important than empty tabs in some cases.
if (!loader->isReady() || loader->viewToUse() == UrlLoader::ViewToUse::NewTab) {
view = createTabForLoadUrlRequest(loader->url(), loader->request());
if (!view) {
loader->setNewTab(false);
}
} else if (loader->viewToUse() == UrlLoader::ViewToUse::CurrentView) {
view = m_currentView;
}
const QString oldLocationBarURL = locationBarURL();
if (view) {
if (view == m_currentView) {
//will do all the stuff below plus GUI stuff
abortLoading();
} else {
view->stop();
// Don't change location bar if not current view
}
}
loader->setView(view);
qDebug() << "VIEW" << loader->view();
loader->setOldLocationBarUrl(oldLocationBarURL);
if (!loader->isReady()) {
bool earlySetLocationBarURL = false;
if (!view && !m_currentView) { // no view yet, e.g. starting with url as argument
earlySetLocationBarURL = true;
} else if (view == m_currentView && view->url().isEmpty()) { // opening in current view
earlySetLocationBarURL = true;
}
if (req.browserArgs.newTab()) { // it's going into a new tab anyway
earlySetLocationBarURL = false;
}
if (earlySetLocationBarURL) {
// Show it for now in the location bar, but we'll need to store it in the view
// later on (can't do it yet since either view == 0 or updateHistoryEntry will be called).
qCDebug(KONQUEROR_LOG) << "url=" << url;
setLocationBarURL(url);
}
if (view == m_currentView) {
startAnimation();
}
}
loader->goOn();
//Remove KonqRun: replaced by UrlLoader::viewForUrl
#if 0
// When clicking a 'follow active' view (e.g. view is the sidebar),
// open the URL in the active view
if (view && view->isFollowActive()) {
......@@ -592,7 +648,6 @@ void KonqMainWindow::openUrl(KonqView *_view, const QUrl &_url,
req.browserArgs.setNewTab(false);
}
}
const QString oldLocationBarURL = locationBarURL();
if (view) {
if (view == m_currentView) {
......@@ -603,49 +658,14 @@ void KonqMainWindow::openUrl(KonqView *_view, const QUrl &_url,
// Don't change location bar if not current view
}
}
// Fast mode for local files: do the stat ourselves instead of letting OpenUrlJob do it.
if (mimeType.isEmpty() && url.isLocalFile()) {
QMimeDatabase db;
mimeType = db.mimeTypeForFile(url.toLocalFile()).name();
}
if (url.isLocalFile()) {
// Generic mechanism for redirecting to tar:/<path>/ when clicking on a tar file,
// zip:/<path>/ when clicking on a zip file, etc.
// The .protocol file specifies the mimetype that the kioslave handles.
// Note that we don't use mimetype inheritance since we don't want to
// open OpenDocument files as zip folders...
// Also note that we do this here and not in openView anymore,
// because in the case of foo.bz2 we don't know the final mimetype, we need a konqrun...
const QString protocol = KProtocolManager::protocolForArchiveMimetype(mimeType);
if (!protocol.isEmpty() && KonqFMSettings::settings()->shouldEmbed(mimeType)) {
url.setScheme(protocol);
if (mimeType == QLatin1String("application/x-webarchive")) {
url.setPath(url.path() + "/index.html");
mimeType = QStringLiteral("text/html");
} else {
if (KProtocolManager::outputType(url) == KProtocolInfo::T_FILESYSTEM) {
if (!url.path().endsWith('/')) {
url.setPath(url.path() + '/');
}
mimeType = QStringLiteral("inode/directory");
} else {
mimeType.clear();
}
}
}
// Redirect to the url in Type=Link desktop files
if (mimeType == QLatin1String("application/x-desktop")) {
KDesktopFile df(url.toLocalFile());
if (df.hasLinkType()) {
url = QUrl(df.readUrl());
mimeType.clear(); // to be determined again
}
}
}
const bool hasMimeType = (!mimeType.isEmpty() && mimeType != QLatin1String("application/octet-stream"));
KService::Ptr offer;
bool associatedAppIsKonqueror = false;
if (hasMimeType) {
......@@ -656,7 +676,6 @@ void KonqMainWindow::openUrl(KonqView *_view, const QUrl &_url,
req.forceAutoEmbed = true;
}
}
//qCDebug(KONQUEROR_LOG) << "trying openView for" << url << "( mimeType" << mimeType << ")";
if (hasMimeType || KonqUrl::isValidNotBlank(url)) {
......@@ -664,14 +683,18 @@ void KonqMainWindow::openUrl(KonqView *_view, const QUrl &_url,
// Built-in view ?
if (!openView(mimeType, url, view /* can be 0 */, req)) {
//qCDebug(KONQUEROR_LOG) << "openView returned false";
#endif
//TODO: Remove KonqRun: is this needed?
#if 0
// Are we following another view ? Then forget about this URL. Otherwise fire app.
if (!req.followMode) {
#endif
#if 0
//qCDebug(KONQUEROR_LOG) << "we were not following. Fire app.";
// The logic below is similar to BrowserRun::handleNonEmbeddable(),
// but we don't have a BrowserRun instance here, and since it uses
// some virtual methods [like save, for KHTMLRun], we can't just
// move all the logic to static methods... catch 22...
if (!url.isLocalFile() && !trustedSource && KonqRun::isTextExecutable(mimeType)) {
mimeType = QStringLiteral("text/plain"); // view, don't execute
}
......@@ -719,6 +742,8 @@ void KonqMainWindow::openUrl(KonqView *_view, const QUrl &_url,
}
}
} else { // no known mimeType, use KonqRun
const bool hasMimeType = (!mimeType.isEmpty() && mimeType != QLatin1String("application/octet-stream"));
if (!hasMimeType) {
bool earlySetLocationBarURL = false;
if (!view && !m_currentView) { // no view yet, e.g. starting with url as argument
earlySetLocationBarURL = true;
......@@ -734,6 +759,10 @@ void KonqMainWindow::openUrl(KonqView *_view, const QUrl &_url,
qCDebug(KONQUEROR_LOG) << "url=" << url;
setLocationBarURL(url);
}
if (view == m_currentView) {
startAnimation();
}
}
qCDebug(KONQUEROR_LOG) << "Creating new konqrun for" << url << "req.typedUrl=" << req.typedUrl;
......@@ -752,8 +781,85 @@ void KonqMainWindow::openUrl(KonqView *_view, const QUrl &_url,
connect(run, &KonqRun::finished, this, &KonqMainWindow::slotRunFinished);
}
#endif
}
void KonqMainWindow::urlLoaderFinished(UrlLoader* loader)
{
//TODO Remove KonqRun: see whether this is still necessary
/*
if (!run->mailtoURL().isEmpty()) {
QDesktopServices::openUrl(run->mailtoURL());
}
*/
//TODO Remove KonqRun: see which of the things below only need to be done if loader->isAsync. In the original code,
//this function (slotRunFinished) was only called when using a KonqRun but now it's always called.
if (loader->hasError()) { // we had an error
QDBusMessage message = QDBusMessage::createSignal(KONQ_MAIN_PATH, QStringLiteral("org.kde.Konqueror.Main"), QStringLiteral("removeFromCombo"));
message << loader->url().toDisplayString();
QDBusConnection::sessionBus().send(message);
}
KonqView *childView = loader->view();
qDebug() << "VIEW" << childView;
// Check if we found a mimetype _and_ we got no error (example: cancel in openwith dialog)
if (!loader->mimeType().isEmpty() && !loader->hasError()) {
// We do this here and not in the constructor, because
// we are waiting for the first view to be set up before doing this...
// Note: this is only used when konqueror is started from command line.....
if (m_bNeedApplyKonqMainWindowSettings) {
m_bNeedApplyKonqMainWindowSettings = false; // only once
applyKonqMainWindowSettings();
}
return;
}
// An error happened in UrlLoader - stop wheel etc.
if (childView) {
childView->setLoading(false);
if (childView == m_currentView) {
stopAnimation();
// Revert to working URL - unless the URL was typed manually
if (loader->request().typedUrl.isEmpty() && childView->currentHistoryEntry()) { // not typed
childView->setLocationBarURL(childView->currentHistoryEntry()->locationBarURL);
}
}
} else { // No view, e.g. starting up empty
stopAnimation();
}
}
KonqView * KonqMainWindow::createTabForLoadUrlRequest(const QUrl& url, const KonqOpenURLRequest& request)
{
KonqView *view = m_pViewManager->addTab(QStringLiteral("text/html"),
QString(),
false,
request.openAfterCurrentPage);
if (view) {
view->setCaption(i18nc("@title:tab", "Loading..."));
view->setLocationBarURL(url);
if (!request.browserArgs.frameName.isEmpty()) {
view->setViewName(request.browserArgs.frameName); // #44961
}
if (request.newTabInFront) {
m_pViewManager->showTab(view);
}
updateViewActions(); //A new tab created -- we may need to enable the "remove tab" button (#56318)
}
return view;
}
// When opening a new view, for @p mimeType, prefer the part used in @p currentView, if possible.
// Testcase: window.open after manually switching to another web engine, and with "open popups in tabs" off.
static QString preferredService(KonqView *currentView, const QString &mimeType)
......@@ -764,6 +870,7 @@ static QString preferredService(KonqView *currentView, const QString &mimeType)
return QString();
}
//TODO remove KonqRun: some of this becomes redundant, at least when called via UrlLoader. Can this be avoided?
bool KonqMainWindow::openView(QString mimeType, const QUrl &_url, KonqView *childView, const KonqOpenURLRequest &req)
{
// Second argument is referring URL
......@@ -773,7 +880,7 @@ bool KonqMainWindow::openView(QString mimeType, const QUrl &_url, KonqView *chil
return true; // Nothing else to do.
}
if (KonqRun::isExecutable(mimeType)) {
if (UrlLoader::isExecutable(mimeType)) {
return false; // execute, don't open
}
// Contract: the caller of this method should ensure the view is stopped first.
......@@ -826,9 +933,9 @@ bool KonqMainWindow::openView(QString mimeType, const QUrl &_url, KonqView *chil
//Force use of WebEnginePart when opening a konq: URL. If the user chose a different
//default HTML engine, they would get an error because they don't know how to handle
//such scheme. As a workaround, in this case we force the use of WebEnginePart
if (KonqUrl::hasKonqScheme(url)) {
serviceName = "webenginepart";
}
// if (KonqUrl::hasKonqScheme(url)) {
// serviceName = "webenginepart";
// }
const QString urlStr = url.url();
if (KonqUrl::isValidNotBlank(urlStr)) {
......@@ -865,16 +972,14 @@ bool KonqMainWindow::openView(QString mimeType, const QUrl &_url, KonqView *chil
// Otherwise the user will get asked 'open or save' in openUrl anyway.
if (!forceAutoEmbed && !KProtocolManager::supportsWriting(url)) {
QString suggestedFileName;
KonqRun *run = childView ? childView->run() : nullptr;
int attachment = 0;
if (run) {
suggestedFileName = run->suggestedFileName();
attachment = (run->serverSuggestsSave()) ? KParts::BrowserRun::AttachmentDisposition : KParts::BrowserRun::InlineDisposition;
UrlLoader *loader = childView ? childView->urlLoader() : nullptr;
if (loader) {
suggestedFileName = loader->suggestedFileName();
}
KParts::BrowserOpenOrSaveQuestion dlg(this, url, mimeType);
dlg.setSuggestedFileName(suggestedFileName);
const KParts::BrowserOpenOrSaveQuestion::Result res = dlg.askEmbedOrSave(attachment);
const KParts::BrowserOpenOrSaveQuestion::Result res = dlg.askEmbedOrSave();
if (res == KParts::BrowserOpenOrSaveQuestion::Embed) {
forceAutoEmbed = true;
} else if (res == KParts::BrowserOpenOrSaveQuestion::Cancel) {
......@@ -1040,6 +1145,7 @@ void KonqMainWindow::openUrlRequestHelper(KonqView *childView, const QUrl &url,
if (args.metaData().value("konq-temp-file") == "1") {
req.tempFile = true;
}
req.suggestedFileName =args.metaData().value("SuggestedFileName");
req.browserArgs = browserArgs;
openUrl(childView, url, args.mimeType(), req, browserArgs.trustedSource);
}
......@@ -1896,54 +2002,6 @@ void KonqMainWindow::slotPartChanged(KonqView *childView, KParts::ReadOnlyPart *
viewsChanged();
}
void KonqMainWindow::slotRunFinished()
{
const KonqRun *run = static_cast<const KonqRun *>(sender());
if (!run->mailtoURL().isEmpty()) {
QDesktopServices::openUrl(run->mailtoURL());
}
if (run->hasError()) { // we had an error
QDBusMessage message = QDBusMessage::createSignal(KONQ_MAIN_PATH, QStringLiteral("org.kde.Konqueror.Main"), QStringLiteral("removeFromCombo"));
message << run->url().toDisplayString();
QDBusConnection::sessionBus().send(message);
}
KonqView *childView = run->childView();
// Check if we found a mimetype _and_ we got no error (example: cancel in openwith dialog)
if (run->wasMimeTypeFound() && !run->hasError()) {
// We do this here and not in the constructor, because
// we are waiting for the first view to be set up before doing this...
// Note: this is only used when konqueror is started from command line.....
if (m_bNeedApplyKonqMainWindowSettings) {
m_bNeedApplyKonqMainWindowSettings = false; // only once
applyKonqMainWindowSettings();
}
return;
}
// An error happened in KonqRun - stop wheel etc.
if (childView) {
childView->setLoading(false);
if (childView == m_currentView) {
stopAnimation();
// Revert to working URL - unless the URL was typed manually
if (run->typedUrl().isEmpty() && childView->currentHistoryEntry()) { // not typed
childView->setLocationBarURL(childView->currentHistoryEntry()->locationBarURL);
}
}
} else { // No view, e.g. starting up empty
stopAnimation();
}
}
void KonqMainWindow::applyKonqMainWindowSettings()
{
const QStringList toggableViewsShown = KonqSettings::toggableViewsShown();
......
......@@ -57,6 +57,7 @@ class KConfigGroup;
class KonqHistoryDialog;
struct HistoryEntry;
class QLineEdit;
class UrlLoader;
namespace KParts
{
......@@ -127,6 +128,8 @@ public:
bool openView(QString mimeType, const QUrl &url, KonqView *childView,
const KonqOpenURLRequest &req = KonqOpenURLRequest::null);
// bool openView(const QString &mimetype, const QUrl &url, KService::Ptr service);
void abortLoading();
void openMultiURL(const QList<QUrl> &url);
......@@ -227,6 +230,8 @@ public:
bool fullScreenMode() const;
KonqView* createTabForLoadUrlRequest(const QUrl &url, const KonqOpenURLRequest &request);
/**
* @return the "link view" action, for checking/unchecking from KonqView
*/
......@@ -370,7 +375,7 @@ public Q_SLOTS:
void slotPartChanged(KonqView *childView, KParts::ReadOnlyPart *oldPart, KParts::ReadOnlyPart *newPart);
void slotRunFinished();
void urlLoaderFinished(UrlLoader *loader);
void slotClearLocationBar();
// reimplement from KParts::MainWindow
......
......@@ -80,6 +80,7 @@ struct KONQ_TESTS_EXPORT KonqOpenURLRequest {
KParts::OpenUrlArguments args;
KParts::BrowserArguments browserArgs;
QList<QUrl> filesToSelect; // files to select in a konqdirpart
QString suggestedFileName;
static KonqOpenURLRequest null;
};
......
/* This file is part of the KDE project
SPDX-FileCopyrightText: 1998, 1999 Torben Weis <weis@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
// Own
#include "konqrun.h"
// KDE
#include "konqdebug.h"
#include <kmessagebox.h>
#include <KLocalizedString>
#include <kio/job.h>
#include <QMimeDatabase>
#include <QMimeType>
#include <QHostInfo>
#include <QFileInfo>
#include <KIO/ApplicationLauncherJob>
#include <KIO/JobUiDelegate>
#include <KUrlAuthorized>
#include <KIO/DesktopExecParser>
#include <KProtocolInfo>
#include <KProtocolManager>
#include <KApplicationTrader>
#include <KJobWidgets>
#include <KParts/PartLoader>
#include <KService>
#include <KMimeTypeTrader>
// Local
#include "konqview.h"
#include "konqframestatusbar.h"
#include "konqhistorymanager.h"
#include "konqsettings.h"
KonqRun::KonqRun(KonqMainWindow *mainWindow, KonqView *_childView,
const QUrl &_url, const KonqOpenURLRequest &req, bool trustedSource)
: KParts::BrowserRun(_url, req.args, req.browserArgs, _childView ? _childView->part() : nullptr, mainWindow,
//remove referrer if request was typed in manually.
// ### TODO: turn this off optionally.
!req.typedUrl.isEmpty(), trustedSource,
// Don't use inline errors on reloading due to auto-refresh sites, but use them in all other cases
// (no reload or user-requested reload)
!req.args.reload() || req.userRequestedReload),
m_pMainWindow(mainWindow), m_pView(_childView), m_bFoundMimeType(false),
m_req(req), m_inlineErrors(!req.args.reload() || req.userRequestedReload),
m_alreadyProcessedByWebEngine(req.args.metaData().contains("AlreadyProcessedByWebEngine")),