Title: [273329] trunk/Source/WebCore
Revision
273329
Author
[email protected]
Date
2021-02-23 12:09:56 -0800 (Tue, 23 Feb 2021)

Log Message

Make system console logging synchronous
https://bugs.webkit.org/show_bug.cgi?id=222279

Reviewed by Alex Christensen.

Previously, the logging of messages to the system console was done in
PageConsoleClient::addMessage(), which was called by
Document::addConsoleMessage(). The latter was called in a TaskQueue
callback.

This had the unfortunate side effect of adding a delay from the time a
macro such as ALWAYS_LOG() is called and the text being printed to the
console. This is particularly a problem when logging 3rd party
libraries that don't use the WebKit logging API to log to stderr, such
as GStreamer, since it causes messages logged by WebKit to not be
synchronized with messages logged by 3rd party libraries or logging
systems. As a consequence the usefulness of WebKit logs is noticeably
reduced.

This patch fixes the issue by moving the code logging to the system
console to the synchronous part of Document::didLogMessage(), while
still handling the rest in the m_logMessageTaskQueue callback.

* dom/Document.cpp:
(WebCore::Document::didLogMessage):
* page/PageConsoleClient.cpp:
(WebCore::PageConsoleClient::addMessage):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (273328 => 273329)


--- trunk/Source/WebCore/ChangeLog	2021-02-23 20:04:05 UTC (rev 273328)
+++ trunk/Source/WebCore/ChangeLog	2021-02-23 20:09:56 UTC (rev 273329)
@@ -1,3 +1,33 @@
+2021-02-23  Alicia Boya GarcĂ­a  <[email protected]>
+
+        Make system console logging synchronous
+        https://bugs.webkit.org/show_bug.cgi?id=222279
+
+        Reviewed by Alex Christensen.
+
+        Previously, the logging of messages to the system console was done in
+        PageConsoleClient::addMessage(), which was called by
+        Document::addConsoleMessage(). The latter was called in a TaskQueue
+        callback.
+
+        This had the unfortunate side effect of adding a delay from the time a
+        macro such as ALWAYS_LOG() is called and the text being printed to the
+        console. This is particularly a problem when logging 3rd party
+        libraries that don't use the WebKit logging API to log to stderr, such
+        as GStreamer, since it causes messages logged by WebKit to not be
+        synchronized with messages logged by 3rd party libraries or logging
+        systems. As a consequence the usefulness of WebKit logs is noticeably
+        reduced.
+
+        This patch fixes the issue by moving the code logging to the system
+        console to the synchronous part of Document::didLogMessage(), while
+        still handling the rest in the m_logMessageTaskQueue callback.
+
+        * dom/Document.cpp:
+        (WebCore::Document::didLogMessage):
+        * page/PageConsoleClient.cpp:
+        (WebCore::PageConsoleClient::addMessage):
+
 2021-02-23  Chris Fleizach  <[email protected]>
 
         AX: VoiceOver incorrectly announces groups in ARIA tree instances as empty

Modified: trunk/Source/WebCore/dom/Document.cpp (273328 => 273329)


--- trunk/Source/WebCore/dom/Document.cpp	2021-02-23 20:04:05 UTC (rev 273328)
+++ trunk/Source/WebCore/dom/Document.cpp	2021-02-23 20:09:56 UTC (rev 273329)
@@ -249,8 +249,10 @@
 #include "XPathExpression.h"
 #include "XPathNSResolver.h"
 #include "XPathResult.h"
+#include <_javascript_Core/ConsoleClient.h>
 #include <_javascript_Core/ConsoleMessage.h>
 #include <_javascript_Core/RegularExpression.h>
+#include <_javascript_Core/ScriptArguments.h>
 #include <_javascript_Core/ScriptCallStack.h>
 #include <_javascript_Core/VM.h>
 #include <ctime>
@@ -8443,13 +8445,21 @@
     if (messageSource == MessageSource::Other)
         return;
 
-    m_logMessageTaskQueue.enqueueTask([this, level, messageSource, logMessages = WTFMove(logMessages)]() mutable {
+    auto messageLevel = messageLevelFromWTFLogLevel(level);
+    auto message = makeUnique<Inspector::ConsoleMessage>(messageSource, MessageType::Log, messageLevel, WTFMove(logMessages), mainWorldExecState(frame()));
+
+    if (UNLIKELY(page->settings().logsPageMessagesToSystemConsoleEnabled() || PageConsoleClient::shouldPrintExceptions())) {
+        if (message->type() == MessageType::Image) {
+            ASSERT(message->arguments());
+            JSC::ConsoleClient::printConsoleMessageWithArguments(message->source(), message->type(), message->level(), message->arguments()->globalObject(), *message->arguments());
+        } else
+            JSC::ConsoleClient::printConsoleMessage(message->source(), message->type(), message->level(), message->toString(), message->url(), message->line(), message->column());
+    }
+
+    m_logMessageTaskQueue.enqueueTask([this, message = WTFMove(message)]() mutable {
         if (!this->page())
             return;
 
-        auto messageLevel = messageLevelFromWTFLogLevel(level);
-        auto message = makeUnique<Inspector::ConsoleMessage>(messageSource, MessageType::Log, messageLevel, WTFMove(logMessages), mainWorldExecState(frame()));
-
         addConsoleMessage(WTFMove(message));
     });
 }

Modified: trunk/Source/WebCore/page/PageConsoleClient.cpp (273328 => 273329)


--- trunk/Source/WebCore/page/PageConsoleClient.cpp	2021-02-23 20:04:05 UTC (rev 273328)
+++ trunk/Source/WebCore/page/PageConsoleClient.cpp	2021-02-23 20:09:56 UTC (rev 273329)
@@ -127,14 +127,6 @@
         } else
             message = consoleMessage->message();
         m_page.chrome().client().addMessageToConsole(consoleMessage->source(), consoleMessage->level(), message, consoleMessage->line(), consoleMessage->column(), consoleMessage->url());
-
-        if (UNLIKELY(m_page.settings().logsPageMessagesToSystemConsoleEnabled() || shouldPrintExceptions())) {
-            if (consoleMessage->type() == MessageType::Image) {
-                ASSERT(consoleMessage->arguments());
-                ConsoleClient::printConsoleMessageWithArguments(consoleMessage->source(), consoleMessage->type(), consoleMessage->level(), consoleMessage->arguments()->globalObject(), *consoleMessage->arguments());
-            } else
-                ConsoleClient::printConsoleMessage(consoleMessage->source(), consoleMessage->type(), consoleMessage->level(), consoleMessage->toString(), consoleMessage->url(), consoleMessage->line(), consoleMessage->column());
-        }
     }
 
     InspectorInstrumentation::addMessageToConsole(m_page, WTFMove(consoleMessage));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to