summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKai Koehne <kai.koehne@theqtcompany.com>2015-10-09 09:32:55 +0200
committerKai Koehne <kai.koehne@theqtcompany.com>2015-11-06 10:00:07 +0000
commitbe8c12a814cbed3f1fcb7097f6980fae6112cbc3 (patch)
treeaf713aee9739d9f994e5a9404d7995f7f2d1011b
parentfce0c120e4e67496e4a8d76398a8c105a76c42c4 (diff)
Print JS console messages by default
Change the behavior of QWebEnginePage/WebEngineView to print JavaScript console.warn and console.error messages by default in a 'js' logging category. This matches also the behavior for QtQml, where console messages end up in a 'qml' logging category by default. So far access to the JavaScript console required either use of the remote debugging functionality, subclassing of QWebEnginePage, or implementing a custom handler. Anyhow, even then writing a seamless forwarding of the data and metadata to the Qt message handler is difficult. This patches implements this forwarding by default. The behavior can be changed by either setting up rules for the 'js' category, e.g. setFilterRules("js.*=false"); or by implementing onJavaScriptConsoleMessage(), or overriding QWebEnginePage::javaScriptConsoleMessage. [ChangeLog] Unhandled JS console messages are now forwarded to to the Qt message handler inside a 'js' category. Change-Id: I5480383a80dcf7a122496f9b7915264ef9036db3 Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
-rw-r--r--examples/webenginewidgets/demobrowser/webview.cpp17
-rw-r--r--examples/webenginewidgets/demobrowser/webview.h1
-rw-r--r--src/webengine/api/qquickwebengineview.cpp25
-rw-r--r--src/webengine/doc/src/webengineview.qdoc3
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp23
-rw-r--r--src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc3
-rw-r--r--tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp21
7 files changed, 51 insertions, 42 deletions
diff --git a/examples/webenginewidgets/demobrowser/webview.cpp b/examples/webenginewidgets/demobrowser/webview.cpp
index c12f3db36..79a6cf344 100644
--- a/examples/webenginewidgets/demobrowser/webview.cpp
+++ b/examples/webenginewidgets/demobrowser/webview.cpp
@@ -315,23 +315,6 @@ void WebPage::proxyAuthenticationRequired(const QUrl &requestUrl, QAuthenticator
}
}
-void WebPage::javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int /*lineNumber*/, const QString& sourceID)
-{
- QUrl url;
- url.setUrl(sourceID);
- switch (level) {
- case InfoMessageLevel:
- // Ignore these, they can still be found in the inspector.
- break;
- case WarningMessageLevel:
- qInfo() << "JavaScript WARNING:" << url.host() << message;
- break;
- case ErrorMessageLevel:
- qInfo() << "JavaScript ERROR:" << url.host() << message;
- break;
- }
-}
-
WebView::WebView(QWidget* parent)
: QWebEngineView(parent)
, m_progress(0)
diff --git a/examples/webenginewidgets/demobrowser/webview.h b/examples/webenginewidgets/demobrowser/webview.h
index a798a15ed..34188a259 100644
--- a/examples/webenginewidgets/demobrowser/webview.h
+++ b/examples/webenginewidgets/demobrowser/webview.h
@@ -71,7 +71,6 @@ protected:
QObject *createPlugin(const QString &classId, const QUrl &url, const QStringList &paramNames, const QStringList &paramValues);
#endif
virtual bool certificateError(const QWebEngineCertificateError &error) Q_DECL_OVERRIDE;
- virtual void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID) Q_DECL_OVERRIDE;
private slots:
#if defined(QWEBENGINEPAGE_UNSUPPORTEDCONTENT)
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 29f819eb3..f45dd67fe 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -67,6 +67,7 @@
#include <QClipboard>
#include <QGuiApplication>
+#include <QLoggingCategory>
#include <QMimeData>
#include <QQmlComponent>
#include <QQmlContext>
@@ -531,7 +532,29 @@ bool QQuickWebEngineViewPrivate::isFullScreenMode() const
void QQuickWebEngineViewPrivate::javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID)
{
Q_Q(QQuickWebEngineView);
- Q_EMIT q->javaScriptConsoleMessage(static_cast<QQuickWebEngineView::JavaScriptConsoleMessageLevel>(level), message, lineNumber, sourceID);
+ if (q->receivers(SIGNAL(javaScriptConsoleMessage(JavaScriptConsoleMessageLevel,QString,int,QString))) > 0) {
+ Q_EMIT q->javaScriptConsoleMessage(static_cast<QQuickWebEngineView::JavaScriptConsoleMessageLevel>(level), message, lineNumber, sourceID);
+ return;
+ }
+
+ static QLoggingCategory loggingCategory("js", QtWarningMsg);
+ const QByteArray file = sourceID.toUtf8();
+ QMessageLogger logger(file.constData(), lineNumber, nullptr, loggingCategory.categoryName());
+
+ switch (level) {
+ case JavaScriptConsoleMessageLevel::Info:
+ if (loggingCategory.isInfoEnabled())
+ logger.info().noquote() << message;
+ break;
+ case JavaScriptConsoleMessageLevel::Warning:
+ if (loggingCategory.isWarningEnabled())
+ logger.warning().noquote() << message;
+ break;
+ case JavaScriptConsoleMessageLevel::Error:
+ if (loggingCategory.isCriticalEnabled())
+ logger.critical().noquote() << message;
+ break;
+ }
}
void QQuickWebEngineViewPrivate::authenticationRequired(QSharedPointer<AuthenticationDialogController> controller)
diff --git a/src/webengine/doc/src/webengineview.qdoc b/src/webengine/doc/src/webengineview.qdoc
index f230ba261..82bec2472 100644
--- a/src/webengine/doc/src/webengineview.qdoc
+++ b/src/webengine/doc/src/webengineview.qdoc
@@ -434,7 +434,8 @@
\a level indicates the severity of the event that triggered the message, that is, whether it
was triggered by an error or a less severe event.
- The corresponding handler is \c onJavaScriptConsoleMessage.
+ The corresponding handler is \c onJavaScriptConsoleMessage. If no handler is specified,
+ the view will log the messages into a \c js \l{QLoggingCategory}{logging category}.
*/
/*!
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index a1c009cc3..75f722f8c 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -55,6 +55,7 @@
#include <QIcon>
#include <QInputDialog>
#include <QLayout>
+#include <QLoggingCategory>
#include <QMenu>
#include <QMessageBox>
#include <QMimeData>
@@ -1303,10 +1304,24 @@ bool QWebEnginePage::javaScriptPrompt(const QUrl &securityOrigin, const QString
void QWebEnginePage::javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString &message, int lineNumber, const QString &sourceID)
{
- Q_UNUSED(level);
- Q_UNUSED(message);
- Q_UNUSED(lineNumber);
- Q_UNUSED(sourceID);
+ static QLoggingCategory loggingCategory("js", QtWarningMsg);
+ static QByteArray file = sourceID.toUtf8();
+ QMessageLogger logger(file.constData(), lineNumber, nullptr, loggingCategory.categoryName());
+
+ switch (level) {
+ case JavaScriptConsoleMessageLevel::InfoMessageLevel:
+ if (loggingCategory.isInfoEnabled())
+ logger.info().noquote() << message;
+ break;
+ case JavaScriptConsoleMessageLevel::WarningMessageLevel:
+ if (loggingCategory.isWarningEnabled())
+ logger.warning().noquote() << message;
+ break;
+ case JavaScriptConsoleMessageLevel::ErrorMessageLevel:
+ if (loggingCategory.isCriticalEnabled())
+ logger.critical().noquote() << message;
+ break;
+ }
}
bool QWebEnginePage::certificateError(const QWebEngineCertificateError &)
diff --git a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc
index b7b3bf022..9c07ce543 100644
--- a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc
+++ b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc
@@ -262,7 +262,8 @@
\a level indicates the severity of the event that triggered the message. That is, whether it
was triggered by an error or a less severe event.
- The default implementation prints nothing.
+ Since Qt 5.6, the default implementation logs the messages in a \c js
+ \l{QLoggingCategory}{logging category}.
*/
/*!
diff --git a/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp b/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp
index b29d8fae6..80445051c 100644
--- a/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp
+++ b/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp
@@ -25,18 +25,6 @@
#include <qwebengineview.h>
#include "../util.h"
-//#define DEBUG_SCRIPT_MESSAGES
-#ifdef DEBUG_SCRIPT_MESSAGES
-class WebEnginePage : public QWebEnginePage {
- void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString &message, int lineNumber, const QString &sourceID) {
- qDebug() << level << message << lineNumber << sourceID;
- }
-
-};
-#else
-typedef QWebEnginePage WebEnginePage;
-#endif
-
class tst_QWebEngineScript: public QObject {
Q_OBJECT
@@ -49,10 +37,9 @@ private Q_SLOTS:
};
-
void tst_QWebEngineScript::domEditing()
{
- WebEnginePage page;
+ QWebEnginePage page;
QWebEngineView view;
view.setPage(&page);
QWebEngineScript s;
@@ -88,7 +75,7 @@ void tst_QWebEngineScript::injectionPoint()
s.setSourceCode("var foo = \"foobar\";");
s.setInjectionPoint(static_cast<QWebEngineScript::InjectionPoint>(injectionPoint));
s.setWorldId(QWebEngineScript::MainWorld);
- WebEnginePage page;
+ QWebEnginePage page;
page.scripts().insert(s);
page.setHtml(QStringLiteral("<html><head><script> var contents;") + testScript
+ QStringLiteral("document.addEventListener(\"load\", setTimeout(function(event) {\
@@ -119,7 +106,7 @@ void tst_QWebEngineScript::injectionPoint_data()
void tst_QWebEngineScript::scriptWorld()
{
- WebEnginePage page;
+ QWebEnginePage page;
QWebEngineScript script;
script.setInjectionPoint(QWebEngineScript::DocumentCreation);
script.setWorldId(QWebEngineScript::MainWorld);
@@ -138,7 +125,7 @@ void tst_QWebEngineScript::scriptWorld()
void tst_QWebEngineScript::scriptModifications()
{
- WebEnginePage page;
+ QWebEnginePage page;
QWebEngineScript script;
script.setName(QStringLiteral("String1"));
script.setInjectionPoint(QWebEngineScript::DocumentCreation);