Skip to content

Commit

Permalink
add debug/info signals, add debug log level, and update JS logging
Browse files Browse the repository at this point in the history
- add and connect debug and info signals across the project
- add a debug log level & additional debugging output
- emit JavaScript console messages as INFO rather than WARNING
  • Loading branch information
terencehonles committed Oct 27, 2020
1 parent 97b8bb8 commit b8f9f5e
Show file tree
Hide file tree
Showing 21 changed files with 203 additions and 28 deletions.
2 changes: 1 addition & 1 deletion src/image/imagearguments.cc
Expand Up @@ -32,7 +32,7 @@ ImageCommandLineParser::ImageCommandLineParser(wkhtmltopdf::settings::ImageGloba
extended(false);
qthack(false);
addarg("quiet", 'q', "Be less verbose, maintained for backwards compatibility; Same as using --log-level none", new ConstSetter<wkhtmltopdf::settings::LogLevel>(s.logLevel, wkhtmltopdf::settings::None));
addarg("log-level", 0, "Set log level to: none, error, warn or info", new LogLevelSetter(s.logLevel, "level"));
addarg("log-level", 0, "Set log level to: none, error, warn, info or debug", new LogLevelSetter(s.logLevel, "level"));
addarg("width",0,"Set screen width, note that this is used only as a guide line. Use --disable-smart-width to make it strict.", new IntSetter(s.screenWidth,"int"));
addarg("height",0,"Set screen height (default is calculated from page content)", new IntSetter(s.screenHeight, "int"));
// addarg("scale-w",0,"Set width for resizing", new IntSetter(s.scale.width,"int"));
Expand Down
8 changes: 8 additions & 0 deletions src/lib/converter.cc
Expand Up @@ -82,6 +82,14 @@ void ConverterPrivate::forwardWarning(QString warning) {
emit outer().warning(warning);
}

void ConverterPrivate::forwardInfo(QString info) {
emit outer().info(info);
}

void ConverterPrivate::forwardDebug(QString debug) {
emit outer().debug(debug);
}

void ConverterPrivate::cancel() {
error=true;
}
Expand Down
2 changes: 2 additions & 0 deletions src/lib/converter.hh
Expand Up @@ -40,6 +40,8 @@ public:
QString progressString();
int httpErrorCode();
signals:
void debug(const QString & message);
void info(const QString & message);
void warning(const QString & message);
void error(const QString & message);
void phaseChanged();
Expand Down
2 changes: 2 additions & 0 deletions src/lib/converter_p.hh
Expand Up @@ -57,6 +57,8 @@ public slots:
bool convert();
void forwardError(QString error);
void forwardWarning(QString warning);
void forwardInfo(QString info);
void forwardDebug(QString debug);
private:
friend class Converter;
};
Expand Down
2 changes: 2 additions & 0 deletions src/lib/image.h
Expand Up @@ -51,6 +51,8 @@ CAPI(int) wkhtmltoimage_get_global_setting(wkhtmltoimage_global_settings * setti
CAPI(wkhtmltoimage_converter *) wkhtmltoimage_create_converter(wkhtmltoimage_global_settings * settings, const char * data);
CAPI(void) wkhtmltoimage_destroy_converter(wkhtmltoimage_converter * converter);

CAPI(void) wkhtmltoimage_set_debug_callback(wkhtmltoimage_converter * converter, wkhtmltoimage_str_callback cb);
CAPI(void) wkhtmltoimage_set_info_callback(wkhtmltoimage_converter * converter, wkhtmltoimage_str_callback cb);
CAPI(void) wkhtmltoimage_set_warning_callback(wkhtmltoimage_converter * converter, wkhtmltoimage_str_callback cb);
CAPI(void) wkhtmltoimage_set_error_callback(wkhtmltoimage_converter * converter, wkhtmltoimage_str_callback cb);
CAPI(void) wkhtmltoimage_set_phase_changed_callback(wkhtmltoimage_converter * converter, wkhtmltoimage_void_callback cb);
Expand Down
20 changes: 19 additions & 1 deletion src/lib/image_c_bindings.cc
Expand Up @@ -48,6 +48,14 @@
#include "dllbegin.inc"
using namespace wkhtmltopdf;

void MyImageConverter::debug(const QString & message) {
if (debug_cb && globalSettings->logLevel > settings::Info) (debug_cb)(reinterpret_cast<wkhtmltoimage_converter*>(this), message.toUtf8().constData());
}

void MyImageConverter::info(const QString & message) {
if (info_cb && globalSettings->logLevel > settings::Warn) (info_cb)(reinterpret_cast<wkhtmltoimage_converter*>(this), message.toUtf8().constData());
}

void MyImageConverter::warning(const QString & message) {
if (warning_cb && globalSettings->logLevel > settings::Error) (warning_cb)(reinterpret_cast<wkhtmltoimage_converter*>(this), message.toUtf8().constData());
}
Expand All @@ -69,9 +77,11 @@ void MyImageConverter::finished(bool ok) {
}

MyImageConverter::MyImageConverter(settings::ImageGlobal * gs, const QString * data):
warning_cb(0), error_cb(0), phase_changed(0), progress_changed(0), finished_cb(0),
debug_cb(0), info_cb(0), warning_cb(0), error_cb(0), phase_changed(0), progress_changed(0), finished_cb(0),
converter(*gs, data), globalSettings(gs) {

connect(&converter, SIGNAL(debug(const QString &)), this, SLOT(debug(const QString &)));
connect(&converter, SIGNAL(info(const QString &)), this, SLOT(info(const QString &)));
connect(&converter, SIGNAL(warning(const QString &)), this, SLOT(warning(const QString &)));
connect(&converter, SIGNAL(error(const QString &)), this, SLOT(error(const QString &)));
connect(&converter, SIGNAL(phaseChanged()), this, SLOT(phaseChanged()));
Expand Down Expand Up @@ -128,6 +138,14 @@ CAPI(void) wkhtmltoimage_destroy_converter(wkhtmltoimage_converter * converter)
delete reinterpret_cast<MyImageConverter *>(converter);
}

CAPI(void) wkhtmltoimage_set_debug_callback(wkhtmltoimage_converter * converter, wkhtmltoimage_str_callback cb) {
reinterpret_cast<MyImageConverter *>(converter)->debug_cb = cb;
}

CAPI(void) wkhtmltoimage_set_info_callback(wkhtmltoimage_converter * converter, wkhtmltoimage_str_callback cb) {
reinterpret_cast<MyImageConverter *>(converter)->info_cb = cb;
}

CAPI(void) wkhtmltoimage_set_warning_callback(wkhtmltoimage_converter * converter, wkhtmltoimage_str_callback cb) {
reinterpret_cast<MyImageConverter *>(converter)->warning_cb = cb;
}
Expand Down
4 changes: 4 additions & 0 deletions src/lib/image_c_bindings_p.hh
Expand Up @@ -30,6 +30,8 @@
class DLL_LOCAL MyImageConverter: public QObject {
Q_OBJECT
public:
wkhtmltoimage_str_callback debug_cb;
wkhtmltoimage_str_callback info_cb;
wkhtmltoimage_str_callback warning_cb;
wkhtmltoimage_str_callback error_cb;
wkhtmltoimage_void_callback phase_changed;
Expand All @@ -43,6 +45,8 @@ public:
MyImageConverter(wkhtmltopdf::settings::ImageGlobal * gs, const QString * data);
~MyImageConverter();
public slots:
void debug(const QString & message);
void info(const QString & message);
void warning(const QString & message);
void error(const QString & message);
void phaseChanged();
Expand Down
2 changes: 2 additions & 0 deletions src/lib/imageconverter.cc
Expand Up @@ -58,6 +58,8 @@ ImageConverterPrivate::ImageConverterPrivate(ImageConverter & o, wkhtmltopdf::se
connect(&loader, SIGNAL(loadFinished(bool)), this, SLOT(pagesLoaded(bool)));
connect(&loader, SIGNAL(error(QString)), this, SLOT(forwardError(QString)));
connect(&loader, SIGNAL(warning(QString)), this, SLOT(forwardWarning(QString)));
connect(&loader, SIGNAL(info(QString)), this, SLOT(forwardInfo(QString)));
connect(&loader, SIGNAL(debug(QString)), this, SLOT(forwardDebug(QString)));
}

void ImageConverterPrivate::beginConvert() {
Expand Down
1 change: 1 addition & 0 deletions src/lib/logging.cc
Expand Up @@ -32,6 +32,7 @@ QMap<QString, LogLevel> logLevelMap() {
res["error"] = Error;
res["warn"] = Warn;
res["info"] = Info;
res["debug"] = Debug;
return res;
}

Expand Down
3 changes: 2 additions & 1 deletion src/lib/logging.hh
Expand Up @@ -31,7 +31,8 @@ enum LogLevel {
None,
Error,
Warn,
Info
Info,
Debug
};

DLL_PUBLIC LogLevel strToLogLevel(const char * s, bool * ok=0);
Expand Down
54 changes: 48 additions & 6 deletions src/lib/multipageloader.cc
Expand Up @@ -72,6 +72,7 @@ void MyNetworkAccessManager::allow(QString path) {
}

QNetworkReply * MyNetworkAccessManager::createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData) {
emit debug(QString("Creating request: ") + req.url().toString());

if (disposed)
{
Expand Down Expand Up @@ -156,31 +157,32 @@ QList<QNetworkProxy> MyNetworkProxyFactory::queryProxy (const QNetworkProxyQuery
MyQWebPage::MyQWebPage(ResourceObject & res): resource(res) {}

void MyQWebPage::javaScriptAlert(QWebFrame *, const QString & msg) {
resource.warning(QString("Javascript alert: %1").arg(msg));
resource.info(QString("Javascript alert: %1").arg(msg));
}

bool MyQWebPage::javaScriptConfirm(QWebFrame *, const QString & msg) {
resource.warning(QString("Javascript confirm: %1 (answered yes)").arg(msg));
resource.info(QString("Javascript confirm: %1 (answered yes)").arg(msg));
return true;
}

bool MyQWebPage::javaScriptPrompt(QWebFrame *, const QString & msg, const QString & defaultValue, QString * result) {
resource.warning(QString("Javascript prompt: %1 (answered %2)").arg(msg,defaultValue));
resource.info(QString("Javascript prompt: %1 (answered %2)").arg(msg,defaultValue));
result = (QString*)&defaultValue;
Q_UNUSED(result);
return true;
}

void MyQWebPage::javaScriptConsoleMessage(const QString & message, int lineNumber, const QString & sourceID) {
if (resource.settings.debugJavascript)
resource.warning(QString("%1:%2 %3").arg(sourceID).arg(lineNumber).arg(message));
resource.info(QString("%1:%2 %3").arg(sourceID).arg(lineNumber).arg(message));
}

bool MyQWebPage::shouldInterruptJavaScript() {
if (resource.settings.stopSlowScripts) {
resource.warning("A slow script was stopped");
return true;
}
resource.debug("A slow script has been detected, but was not stopped");
return false;
}

Expand All @@ -194,6 +196,7 @@ ResourceObject::ResourceObject(MultiPageLoaderPrivate & mpl, const QUrl & u, con
url(u),
loginTry(0),
progress(0),
windowStatusCounter(0),
finished(false),
signalPrint(false),
multiPageLoader(mpl),
Expand Down Expand Up @@ -221,6 +224,12 @@ ResourceObject::ResourceObject(MultiPageLoaderPrivate & mpl, const QUrl & u, con
connect(&networkAccessManager, SIGNAL(finished (QNetworkReply *)),
this, SLOT(amfinished (QNetworkReply *) ) );

connect(&networkAccessManager, SIGNAL(debug(const QString &)),
this, SLOT(debug(const QString &)));

connect(&networkAccessManager, SIGNAL(info(const QString &)),
this, SLOT(info(const QString &)));

connect(&networkAccessManager, SIGNAL(warning(const QString &)),
this, SLOT(warning(const QString &)));

Expand Down Expand Up @@ -265,6 +274,7 @@ ResourceObject::ResourceObject(MultiPageLoaderPrivate & mpl, const QUrl & u, con
* Once loading starting, this is called
*/
void ResourceObject::loadStarted() {
debug("QWebPage load started.");
if (finished == true) {
++multiPageLoader.loading;
finished = false;
Expand Down Expand Up @@ -296,6 +306,8 @@ void ResourceObject::loadProgress(int p) {


void ResourceObject::loadFinished(bool ok) {
debug("QWebPage load finished.");

// If we are finished, this might be a potential bug.
if (finished || multiPageLoader.resources.size() <= 0) {
warning("A finished ResourceObject received a loading finished signal. "
Expand Down Expand Up @@ -330,10 +342,16 @@ void ResourceObject::loadFinished(bool ok) {

void ResourceObject::waitWindowStatus() {
QString windowStatus = webPage.mainFrame()->evaluateJavaScript("window.status").toString();
//warning(QString("window.status:" + windowStatus + " settings.windowStatus:" + settings.windowStatus));
if (windowStatus != settings.windowStatus) {
// This is once a second
if ((++windowStatusCounter % 20) == 0) {
windowStatusCounter = 0;
debug(QString("Waiting for window.status; Found: \"" + windowStatus + "\", but expecting: \"" + settings.windowStatus + "\"."));
}

QTimer::singleShot(50, this, SLOT(waitWindowStatus()));
} else {
debug("Window status \"" + settings.windowStatus + "\" found.");
QTimer::singleShot(settings.jsdelay, this, SLOT(loadDone()));
}
}
Expand All @@ -347,6 +365,8 @@ void ResourceObject::loadDone() {
if (finished) return;
finished=true;

debug("Loading done; Stopping QWebPage and any possible page refreshes.");

// Ensure no more loading goes..
webPage.triggerAction(QWebPage::Stop);
webPage.triggerAction(QWebPage::StopScheduledPageRefresh);
Expand Down Expand Up @@ -384,6 +404,14 @@ void ResourceObject::handleAuthenticationRequired(QNetworkReply *reply, QAuthent
}
}

void ResourceObject::debug(const QString & str) {
emit multiPageLoader.outer.debug(str);
}

void ResourceObject::info(const QString & str) {
emit multiPageLoader.outer.info(str);
}

void ResourceObject::warning(const QString & str) {
emit multiPageLoader.outer.warning(str);
}
Expand All @@ -397,6 +425,8 @@ void ResourceObject::error(const QString & str) {
* \param reply The networkreply that has finished
*/
void ResourceObject::amfinished(QNetworkReply * reply) {
debug(QString("Finished request: ") + reply->url().toString());

int networkStatus = reply->error();
int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if ((networkStatus != 0 && networkStatus != 5) || (httpStatus > 399 && httpErrorCode == 0))
Expand Down Expand Up @@ -797,9 +827,21 @@ void MultiPageLoader::cancel() {
\brief Signal emitted when loading has started
*/

/*!
\fn void MultiPageLoader::debug(QString text)
\brief Signal emitted when a debug message was generated
\param text The debug message
*/

/*!
\fn void MultiPageLoader::info(QString text)
\brief Signal emitted when an info message was generated
\param text The info message
*/

/*!
\fn void MultiPageLoader::warning(QString text)
\brief Signal emitted when a none fatal warning has occurred
\brief Signal emitted when a non fatal warning has occurred
\param text A string describing the warning
*/

Expand Down
2 changes: 2 additions & 0 deletions src/lib/multipageloader.hh
Expand Up @@ -63,6 +63,8 @@ signals:
void loadFinished(bool ok);
void loadProgress(int progress);
void loadStarted();
void debug(QString text);
void info(QString text);
void warning(QString text);
void error(QString text);
private:
Expand Down
5 changes: 5 additions & 0 deletions src/lib/multipageloader_p.hh
Expand Up @@ -57,6 +57,8 @@ public:
MyNetworkAccessManager(const settings::LoadPage & s);
QNetworkReply * createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0);
signals:
void debug(const QString & text);
void info(const QString & text);
void warning(const QString & text);
void error(const QString & text);
};
Expand Down Expand Up @@ -86,6 +88,7 @@ private:
QUrl url;
int loginTry;
int progress;
int windowStatusCounter;
bool finished;
bool signalPrint;
MultiPageLoaderPrivate & multiPageLoader;
Expand All @@ -104,6 +107,8 @@ public slots:
void printRequested(QWebFrame * frame);
void loadDone();
void handleAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator);
void debug(const QString & str);
void info(const QString & str);
void warning(const QString & str);
void error(const QString & str);
void sslErrors(QNetworkReply *reply, const QList<QSslError> &);
Expand Down
2 changes: 2 additions & 0 deletions src/lib/pdf.h
Expand Up @@ -61,6 +61,8 @@ CAPI(int) wkhtmltopdf_get_object_setting(wkhtmltopdf_object_settings * settings,
CAPI(wkhtmltopdf_converter *) wkhtmltopdf_create_converter(wkhtmltopdf_global_settings * settings);
CAPI(void) wkhtmltopdf_destroy_converter(wkhtmltopdf_converter * converter);

CAPI(void) wkhtmltopdf_set_debug_callback(wkhtmltopdf_converter * converter, wkhtmltopdf_str_callback cb);
CAPI(void) wkhtmltopdf_set_info_callback(wkhtmltopdf_converter * converter, wkhtmltopdf_str_callback cb);
CAPI(void) wkhtmltopdf_set_warning_callback(wkhtmltopdf_converter * converter, wkhtmltopdf_str_callback cb);
CAPI(void) wkhtmltopdf_set_error_callback(wkhtmltopdf_converter * converter, wkhtmltopdf_str_callback cb);
CAPI(void) wkhtmltopdf_set_phase_changed_callback(wkhtmltopdf_converter * converter, wkhtmltopdf_void_callback cb);
Expand Down

0 comments on commit b8f9f5e

Please sign in to comment.