Web Inspector: add compiler UNLIKELY hints when checking if developer extras are enabled
https://bugs.webkit.org/show_bug.cgi?id=204875

Reviewed by Joseph Pecoraro.

Source/JavaScriptCore:

Move the check for whether developer extras are enabled from the agent to the client so that
when inspecting a webpage, we don't check for it twice, since `InspectorInstrumentation`
already checks for it too.

* inspector/agents/InspectorConsoleAgent.h:
* inspector/agents/InspectorConsoleAgent.cpp:
(Inspector::InspectorConsoleAgent::developerExtrasEnabled const): Added.
(Inspector::InspectorConsoleAgent::addMessageToConsole):
(Inspector::InspectorConsoleAgent::startTiming):
(Inspector::InspectorConsoleAgent::logTiming):
(Inspector::InspectorConsoleAgent::stopTiming):
(Inspector::InspectorConsoleAgent::takeHeapSnapshot):
(Inspector::InspectorConsoleAgent::count):
(Inspector::InspectorConsoleAgent::countReset):
(Inspector::InspectorConsoleAgent::addConsoleMessage):

* inspector/JSGlobalObjectConsoleClient.cpp:
(Inspector::JSGlobalObjectConsoleClient::messageWithTypeAndLevel):
(Inspector::JSGlobalObjectConsoleClient::count):
(Inspector::JSGlobalObjectConsoleClient::countReset):
(Inspector::JSGlobalObjectConsoleClient::profile):
(Inspector::JSGlobalObjectConsoleClient::profileEnd):
(Inspector::JSGlobalObjectConsoleClient::takeHeapSnapshot):
(Inspector::JSGlobalObjectConsoleClient::time):
(Inspector::JSGlobalObjectConsoleClient::timeLog):
(Inspector::JSGlobalObjectConsoleClient::timeEnd):
(Inspector::JSGlobalObjectConsoleClient::timeStamp):
(Inspector::JSGlobalObjectConsoleClient::record):
(Inspector::JSGlobalObjectConsoleClient::recordEnd):
(Inspector::JSGlobalObjectConsoleClient::screenshot):

Source/WebCore:

* inspector/InspectorInstrumentation.h:
(WebCore::InspectorInstrumentation::consoleStartRecordingCanvas):
(WebCore::InspectorInstrumentation::consoleStopRecordingCanvas): Added.
* inspector/InspectorInstrumentation.cpp:
(WebCore::InspectorInstrumentation::frameWindowDiscardedImpl):
(WebCore::InspectorInstrumentation::didReceiveResourceResponseImpl):
(WebCore::InspectorInstrumentation::didFailLoadingImpl):
(WebCore::InspectorInstrumentation::didCommitLoadImpl):
(WebCore::InspectorInstrumentation::addMessageToConsoleImpl):
(WebCore::InspectorInstrumentation::consoleCountImpl):
(WebCore::InspectorInstrumentation::consoleCountResetImpl):
(WebCore::InspectorInstrumentation::startConsoleTimingImpl):
(WebCore::InspectorInstrumentation::logConsoleTimingImpl):
(WebCore::InspectorInstrumentation::stopConsoleTimingImpl):
(WebCore::InspectorInstrumentation::consoleStopRecordingCanvasImpl): Added.

* inspector/agents/WebConsoleAgent.cpp:
(WebCore::WebConsoleAgent::frameWindowDiscarded):
(WebCore::WebConsoleAgent::didReceiveResponse):
(WebCore::WebConsoleAgent::didFailLoading):
Remove the redundant check for whether developer extras are enabled since it's already
checked by `InspectorInstrumentation`.

* page/PageConsoleClient.cpp:
(WebCore::PageConsoleClient::record):
(WebCore::PageConsoleClient::recordEnd):
* inspector/agents/InspectorCanvasAgent.h:
* inspector/agents/InspectorCanvasAgent.cpp:
(WebCore::InspectorCanvasAgent::consoleStopRecordingCanvas): Added.
Add checks for `InspectorInstrumentation::hasFrontends()` to avoid doing extra work when Web
Inspector isn't open.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@253226 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index 5b9fa70..ff56a72 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,41 @@
+2019-12-06  Devin Rousso  <drousso@apple.com>
+
+        Web Inspector: add compiler UNLIKELY hints when checking if developer extras are enabled
+        https://bugs.webkit.org/show_bug.cgi?id=204875
+
+        Reviewed by Joseph Pecoraro.
+
+        Move the check for whether developer extras are enabled from the agent to the client so that
+        when inspecting a webpage, we don't check for it twice, since `InspectorInstrumentation`
+        already checks for it too.
+
+        * inspector/agents/InspectorConsoleAgent.h:
+        * inspector/agents/InspectorConsoleAgent.cpp:
+        (Inspector::InspectorConsoleAgent::developerExtrasEnabled const): Added.
+        (Inspector::InspectorConsoleAgent::addMessageToConsole):
+        (Inspector::InspectorConsoleAgent::startTiming):
+        (Inspector::InspectorConsoleAgent::logTiming):
+        (Inspector::InspectorConsoleAgent::stopTiming):
+        (Inspector::InspectorConsoleAgent::takeHeapSnapshot):
+        (Inspector::InspectorConsoleAgent::count):
+        (Inspector::InspectorConsoleAgent::countReset):
+        (Inspector::InspectorConsoleAgent::addConsoleMessage):
+
+        * inspector/JSGlobalObjectConsoleClient.cpp:
+        (Inspector::JSGlobalObjectConsoleClient::messageWithTypeAndLevel):
+        (Inspector::JSGlobalObjectConsoleClient::count):
+        (Inspector::JSGlobalObjectConsoleClient::countReset):
+        (Inspector::JSGlobalObjectConsoleClient::profile):
+        (Inspector::JSGlobalObjectConsoleClient::profileEnd):
+        (Inspector::JSGlobalObjectConsoleClient::takeHeapSnapshot):
+        (Inspector::JSGlobalObjectConsoleClient::time):
+        (Inspector::JSGlobalObjectConsoleClient::timeLog):
+        (Inspector::JSGlobalObjectConsoleClient::timeEnd):
+        (Inspector::JSGlobalObjectConsoleClient::timeStamp):
+        (Inspector::JSGlobalObjectConsoleClient::record):
+        (Inspector::JSGlobalObjectConsoleClient::recordEnd):
+        (Inspector::JSGlobalObjectConsoleClient::screenshot):
+
 2019-12-06  Keith Miller  <keith_miller@apple.com>
 
         Remove various .order files.
diff --git a/Source/JavaScriptCore/inspector/JSGlobalObjectConsoleClient.cpp b/Source/JavaScriptCore/inspector/JSGlobalObjectConsoleClient.cpp
index 011cd71..8def7e2 100644
--- a/Source/JavaScriptCore/inspector/JSGlobalObjectConsoleClient.cpp
+++ b/Source/JavaScriptCore/inspector/JSGlobalObjectConsoleClient.cpp
@@ -65,6 +65,9 @@
     if (JSGlobalObjectConsoleClient::logToSystemConsole())
         ConsoleClient::printConsoleMessageWithArguments(MessageSource::ConsoleAPI, type, level, globalObject, arguments.copyRef());
 
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
     String message;
     arguments->getFirstArgumentAsString(message);
     m_consoleAgent->addMessageToConsole(makeUnique<ConsoleMessage>(MessageSource::ConsoleAPI, type, level, message, WTFMove(arguments), globalObject));
@@ -77,17 +80,23 @@
 
 void JSGlobalObjectConsoleClient::count(JSGlobalObject* globalObject, const String& label)
 {
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
     m_consoleAgent->count(globalObject, label);
 }
 
 void JSGlobalObjectConsoleClient::countReset(JSGlobalObject* globalObject, const String& label)
 {
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
     m_consoleAgent->countReset(globalObject, label);
 }
 
 void JSGlobalObjectConsoleClient::profile(JSC::JSGlobalObject*, const String& title)
 {
-    if (!m_consoleAgent->enabled())
+    if (LIKELY(!m_consoleAgent->enabled()))
         return;
 
     // Allow duplicate unnamed profiles. Disallow duplicate named profiles.
@@ -108,7 +117,7 @@
 
 void JSGlobalObjectConsoleClient::profileEnd(JSC::JSGlobalObject*, const String& title)
 {
-    if (!m_consoleAgent->enabled())
+    if (LIKELY(!m_consoleAgent->enabled()))
         return;
 
     // Stop profiles in reverse order. If the title is empty, then stop the last profile.
@@ -155,35 +164,65 @@
 
 void JSGlobalObjectConsoleClient::takeHeapSnapshot(JSC::JSGlobalObject*, const String& title)
 {
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
     m_consoleAgent->takeHeapSnapshot(title);
 }
 
 void JSGlobalObjectConsoleClient::time(JSGlobalObject* globalObject, const String& label)
 {
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
     m_consoleAgent->startTiming(globalObject, label);
 }
 
 void JSGlobalObjectConsoleClient::timeLog(JSGlobalObject* globalObject, const String& label, Ref<ScriptArguments>&& arguments)
 {
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
     m_consoleAgent->logTiming(globalObject, label, WTFMove(arguments));
 }
 
 void JSGlobalObjectConsoleClient::timeEnd(JSGlobalObject* globalObject, const String& label)
 {
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
     m_consoleAgent->stopTiming(globalObject, label);
 }
 
 void JSGlobalObjectConsoleClient::timeStamp(JSGlobalObject*, Ref<ScriptArguments>&&)
 {
-    // FIXME: JSContext inspection needs a timeline.
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
     warnUnimplemented("console.timeStamp"_s);
 }
 
-void JSGlobalObjectConsoleClient::record(JSGlobalObject*, Ref<ScriptArguments>&&) { }
-void JSGlobalObjectConsoleClient::recordEnd(JSGlobalObject*, Ref<ScriptArguments>&&) { }
+void JSGlobalObjectConsoleClient::record(JSGlobalObject*, Ref<ScriptArguments>&&)
+{
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
+    warnUnimplemented("console.record"_s);
+}
+
+void JSGlobalObjectConsoleClient::recordEnd(JSGlobalObject*, Ref<ScriptArguments>&&)
+{
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
+    warnUnimplemented("console.recordEnd"_s);
+}
 
 void JSGlobalObjectConsoleClient::screenshot(JSGlobalObject*, Ref<ScriptArguments>&&)
 {
+    if (LIKELY(!m_consoleAgent->developerExtrasEnabled()))
+        return;
+
     warnUnimplemented("console.screenshot"_s);
 }
 
diff --git a/Source/JavaScriptCore/inspector/agents/InspectorConsoleAgent.cpp b/Source/JavaScriptCore/inspector/agents/InspectorConsoleAgent.cpp
index e18b865..26814fe 100644
--- a/Source/JavaScriptCore/inspector/agents/InspectorConsoleAgent.cpp
+++ b/Source/JavaScriptCore/inspector/agents/InspectorConsoleAgent.cpp
@@ -106,6 +106,11 @@
         m_frontendDispatcher->messagesCleared();
 }
 
+bool InspectorConsoleAgent::developerExtrasEnabled() const
+{
+    return m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled();
+}
+
 void InspectorConsoleAgent::reset()
 {
     ErrorString ignored;
@@ -117,9 +122,6 @@
 
 void InspectorConsoleAgent::addMessageToConsole(std::unique_ptr<ConsoleMessage> message)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     if (message->type() == MessageType::Clear) {
         ErrorString ignored;
         clearMessages(ignored);
@@ -130,9 +132,6 @@
 
 void InspectorConsoleAgent::startTiming(JSC::JSGlobalObject* globalObject, const String& label)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     ASSERT(!label.isNull());
     if (label.isNull())
         return;
@@ -148,9 +147,6 @@
 
 void InspectorConsoleAgent::logTiming(JSC::JSGlobalObject* globalObject, const String& label, Ref<ScriptArguments>&& arguments)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     ASSERT(!label.isNull());
     if (label.isNull())
         return;
@@ -173,9 +169,6 @@
 
 void InspectorConsoleAgent::stopTiming(JSC::JSGlobalObject* globalObject, const String& label)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     ASSERT(!label.isNull());
     if (label.isNull())
         return;
@@ -200,9 +193,6 @@
 
 void InspectorConsoleAgent::takeHeapSnapshot(const String& title)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     if (!m_heapAgent)
         return;
 
@@ -216,9 +206,6 @@
 
 void InspectorConsoleAgent::count(JSC::JSGlobalObject* globalObject, const String& label)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     auto result = m_counts.add(label, 1);
     if (!result.isNewEntry)
         result.iterator->value += 1;
@@ -231,9 +218,6 @@
 
 void InspectorConsoleAgent::countReset(JSC::JSGlobalObject* globalObject, const String& label)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     auto it = m_counts.find(label);
     if (it == m_counts.end()) {
         // FIXME: Send an enum to the frontend for localization?
@@ -256,9 +240,6 @@
 
 void InspectorConsoleAgent::addConsoleMessage(std::unique_ptr<ConsoleMessage> consoleMessage)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     ASSERT_ARG(consoleMessage, consoleMessage);
 
     ConsoleMessage* previousMessage = m_consoleMessages.isEmpty() ? nullptr : m_consoleMessages.last().get();
diff --git a/Source/JavaScriptCore/inspector/agents/InspectorConsoleAgent.h b/Source/JavaScriptCore/inspector/agents/InspectorConsoleAgent.h
index 0d10609..f8ba2f2 100644
--- a/Source/JavaScriptCore/inspector/agents/InspectorConsoleAgent.h
+++ b/Source/JavaScriptCore/inspector/agents/InspectorConsoleAgent.h
@@ -70,6 +70,7 @@
     void setInspectorHeapAgent(InspectorHeapAgent* agent) { m_heapAgent = agent; }
 
     bool enabled() const { return m_enabled; }
+    bool developerExtrasEnabled() const;
     void reset();
 
     void addMessageToConsole(std::unique_ptr<ConsoleMessage>);
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 293ff55..cc99f0d 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,42 @@
+2019-12-06  Devin Rousso  <drousso@apple.com>
+
+        Web Inspector: add compiler UNLIKELY hints when checking if developer extras are enabled
+        https://bugs.webkit.org/show_bug.cgi?id=204875
+
+        Reviewed by Joseph Pecoraro.
+
+        * inspector/InspectorInstrumentation.h:
+        (WebCore::InspectorInstrumentation::consoleStartRecordingCanvas):
+        (WebCore::InspectorInstrumentation::consoleStopRecordingCanvas): Added.
+        * inspector/InspectorInstrumentation.cpp:
+        (WebCore::InspectorInstrumentation::frameWindowDiscardedImpl):
+        (WebCore::InspectorInstrumentation::didReceiveResourceResponseImpl):
+        (WebCore::InspectorInstrumentation::didFailLoadingImpl):
+        (WebCore::InspectorInstrumentation::didCommitLoadImpl):
+        (WebCore::InspectorInstrumentation::addMessageToConsoleImpl):
+        (WebCore::InspectorInstrumentation::consoleCountImpl):
+        (WebCore::InspectorInstrumentation::consoleCountResetImpl):
+        (WebCore::InspectorInstrumentation::startConsoleTimingImpl):
+        (WebCore::InspectorInstrumentation::logConsoleTimingImpl):
+        (WebCore::InspectorInstrumentation::stopConsoleTimingImpl):
+        (WebCore::InspectorInstrumentation::consoleStopRecordingCanvasImpl): Added.
+
+        * inspector/agents/WebConsoleAgent.cpp:
+        (WebCore::WebConsoleAgent::frameWindowDiscarded):
+        (WebCore::WebConsoleAgent::didReceiveResponse):
+        (WebCore::WebConsoleAgent::didFailLoading):
+        Remove the redundant check for whether developer extras are enabled since it's already
+        checked by `InspectorInstrumentation`.
+
+        * page/PageConsoleClient.cpp:
+        (WebCore::PageConsoleClient::record):
+        (WebCore::PageConsoleClient::recordEnd):
+        * inspector/agents/InspectorCanvasAgent.h:
+        * inspector/agents/InspectorCanvasAgent.cpp:
+        (WebCore::InspectorCanvasAgent::consoleStopRecordingCanvas): Added.
+        Add checks for `InspectorInstrumentation::hasFrontends()` to avoid doing extra work when Web
+        Inspector isn't open.
+
 2019-12-06  Zalan Bujtas  <zalan@apple.com>
 
         [LFC][IFC] Use explicit 0_lu value instead of LayoutUnit { }
diff --git a/Source/WebCore/inspector/InspectorInstrumentation.cpp b/Source/WebCore/inspector/InspectorInstrumentation.cpp
index 0ad193c..4f18b58 100644
--- a/Source/WebCore/inspector/InspectorInstrumentation.cpp
+++ b/Source/WebCore/inspector/InspectorInstrumentation.cpp
@@ -222,7 +222,7 @@
 
 void InspectorInstrumentation::frameWindowDiscardedImpl(InstrumentingAgents& instrumentingAgents, DOMWindow* window)
 {
-    if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
         return;
 
     if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
@@ -586,7 +586,7 @@
 
 void InspectorInstrumentation::didReceiveResourceResponseImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, ResourceLoader* resourceLoader)
 {
-    if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
         return;
 
     if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
@@ -615,7 +615,7 @@
 
 void InspectorInstrumentation::didFailLoadingImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, DocumentLoader* loader, const ResourceError& error)
 {
-    if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
         return;
 
     if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
@@ -680,7 +680,7 @@
 
 void InspectorInstrumentation::didCommitLoadImpl(InstrumentingAgents& instrumentingAgents, Frame& frame, DocumentLoader* loader)
 {
-    if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
         return;
 
     if (!frame.page())
@@ -831,7 +831,7 @@
 
 void InspectorInstrumentation::addMessageToConsoleImpl(InstrumentingAgents& instrumentingAgents, std::unique_ptr<ConsoleMessage> message)
 {
-    if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
         return;
 
     MessageSource source = message->source();
@@ -849,12 +849,18 @@
 
 void InspectorInstrumentation::consoleCountImpl(InstrumentingAgents& instrumentingAgents, JSC::JSGlobalObject* state, const String& label)
 {
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
+        return;
+
     if (auto* consoleAgent = instrumentingAgents.webConsoleAgent())
         consoleAgent->count(state, label);
 }
 
 void InspectorInstrumentation::consoleCountResetImpl(InstrumentingAgents& instrumentingAgents, JSC::JSGlobalObject* state, const String& label)
 {
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
+        return;
+
     if (auto* consoleAgent = instrumentingAgents.webConsoleAgent())
         consoleAgent->countReset(state, label);
 }
@@ -867,7 +873,7 @@
 
 void InspectorInstrumentation::startConsoleTimingImpl(InstrumentingAgents& instrumentingAgents, Frame& frame, JSC::JSGlobalObject* exec, const String& label)
 {
-    if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
         return;
 
     if (auto* timelineAgent = instrumentingAgents.trackingInspectorTimelineAgent())
@@ -878,7 +884,7 @@
 
 void InspectorInstrumentation::startConsoleTimingImpl(InstrumentingAgents& instrumentingAgents, JSC::JSGlobalObject* exec, const String& label)
 {
-    if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
         return;
 
     if (auto* consoleAgent = instrumentingAgents.webConsoleAgent())
@@ -887,7 +893,7 @@
 
 void InspectorInstrumentation::logConsoleTimingImpl(InstrumentingAgents& instrumentingAgents, JSC::JSGlobalObject* exec, const String& label, Ref<Inspector::ScriptArguments>&& arguments)
 {
-    if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
         return;
 
     if (auto* consoleAgent = instrumentingAgents.webConsoleAgent())
@@ -896,7 +902,7 @@
 
 void InspectorInstrumentation::stopConsoleTimingImpl(InstrumentingAgents& instrumentingAgents, Frame& frame, JSC::JSGlobalObject* exec, const String& label)
 {
-    if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
         return;
 
     if (auto* consoleAgent = instrumentingAgents.webConsoleAgent())
@@ -907,7 +913,7 @@
 
 void InspectorInstrumentation::stopConsoleTimingImpl(InstrumentingAgents& instrumentingAgents, JSC::JSGlobalObject* exec, const String& label)
 {
-    if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
+    if (LIKELY(!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled()))
         return;
 
     if (auto* consoleAgent = instrumentingAgents.webConsoleAgent())
@@ -941,6 +947,12 @@
         canvasAgent->consoleStartRecordingCanvas(context, exec, options);
 }
 
+void InspectorInstrumentation::consoleStopRecordingCanvasImpl(InstrumentingAgents& instrumentingAgents, CanvasRenderingContext& context)
+{
+    if (auto* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
+        canvasAgent->consoleStopRecordingCanvas(context);
+}
+
 void InspectorInstrumentation::didOpenDatabaseImpl(InstrumentingAgents& instrumentingAgents, Database& database)
 {
     if (auto* databaseAgent = instrumentingAgents.inspectorDatabaseAgent())
diff --git a/Source/WebCore/inspector/InspectorInstrumentation.h b/Source/WebCore/inspector/InspectorInstrumentation.h
index 6698431..dbf8220 100644
--- a/Source/WebCore/inspector/InspectorInstrumentation.h
+++ b/Source/WebCore/inspector/InspectorInstrumentation.h
@@ -254,6 +254,7 @@
     static void startProfiling(Page&, JSC::JSGlobalObject*, const String& title);
     static void stopProfiling(Page&, JSC::JSGlobalObject*, const String& title);
     static void consoleStartRecordingCanvas(CanvasRenderingContext&, JSC::JSGlobalObject&, JSC::JSObject* options);
+    static void consoleStopRecordingCanvas(CanvasRenderingContext&);
 
     static void didRequestAnimationFrame(Document&, int callbackId);
     static void didCancelAnimationFrame(Document&, int callbackId);
@@ -449,6 +450,7 @@
     static void startProfilingImpl(InstrumentingAgents&, JSC::JSGlobalObject*, const String& title);
     static void stopProfilingImpl(InstrumentingAgents&, JSC::JSGlobalObject*, const String& title);
     static void consoleStartRecordingCanvasImpl(InstrumentingAgents&, CanvasRenderingContext&, JSC::JSGlobalObject&, JSC::JSObject* options);
+    static void consoleStopRecordingCanvasImpl(InstrumentingAgents&, CanvasRenderingContext&);
 
     static void didRequestAnimationFrameImpl(InstrumentingAgents&, int callbackId, Document&);
     static void didCancelAnimationFrameImpl(InstrumentingAgents&, int callbackId, Document&);
@@ -1582,11 +1584,16 @@
 
 inline void InspectorInstrumentation::consoleStartRecordingCanvas(CanvasRenderingContext& context, JSC::JSGlobalObject& exec, JSC::JSObject* options)
 {
-    FAST_RETURN_IF_NO_FRONTENDS(void());
     if (InstrumentingAgents* instrumentingAgents = instrumentingAgentsForContext(context.canvasBase().scriptExecutionContext()))
         consoleStartRecordingCanvasImpl(*instrumentingAgents, context, exec, options);
 }
 
+inline void InspectorInstrumentation::consoleStopRecordingCanvas(CanvasRenderingContext& context)
+{
+    if (auto* instrumentingAgents = instrumentingAgentsForContext(context.canvasBase().scriptExecutionContext()))
+        consoleStopRecordingCanvasImpl(*instrumentingAgents, context);
+}
+
 inline void InspectorInstrumentation::didRequestAnimationFrame(Document& document, int callbackId)
 {
     FAST_RETURN_IF_NO_FRONTENDS(void());
diff --git a/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp b/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp
index 7568290..1d398c5 100644
--- a/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp
+++ b/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp
@@ -568,6 +568,11 @@
     startRecording(*inspectorCanvas, Inspector::Protocol::Recording::Initiator::Console, WTFMove(recordingOptions));
 }
 
+void InspectorCanvasAgent::consoleStopRecordingCanvas(CanvasRenderingContext& context)
+{
+    didFinishRecordingCanvasFrame(context, true);
+}
+
 #if ENABLE(WEBGL)
 void InspectorCanvasAgent::didEnableExtension(WebGLRenderingContextBase& context, const String& extension)
 {
diff --git a/Source/WebCore/inspector/agents/InspectorCanvasAgent.h b/Source/WebCore/inspector/agents/InspectorCanvasAgent.h
index 283efda..ff9a533 100644
--- a/Source/WebCore/inspector/agents/InspectorCanvasAgent.h
+++ b/Source/WebCore/inspector/agents/InspectorCanvasAgent.h
@@ -97,6 +97,7 @@
     void recordCanvasAction(CanvasRenderingContext&, const String&, std::initializer_list<RecordCanvasActionVariant>&& = { });
     void didFinishRecordingCanvasFrame(CanvasRenderingContext&, bool forceDispatch = false);
     void consoleStartRecordingCanvas(CanvasRenderingContext&, JSC::JSGlobalObject&, JSC::JSObject* options);
+    void consoleStopRecordingCanvas(CanvasRenderingContext&);
 #if ENABLE(WEBGL)
     void didEnableExtension(WebGLRenderingContextBase&, const String&);
     void didCreateWebGLProgram(WebGLRenderingContextBase&, WebGLProgram&);
diff --git a/Source/WebCore/inspector/agents/WebConsoleAgent.cpp b/Source/WebCore/inspector/agents/WebConsoleAgent.cpp
index e9d351b..32994a3 100644
--- a/Source/WebCore/inspector/agents/WebConsoleAgent.cpp
+++ b/Source/WebCore/inspector/agents/WebConsoleAgent.cpp
@@ -52,9 +52,6 @@
 
 void WebConsoleAgent::frameWindowDiscarded(DOMWindow* window)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     for (auto& message : m_consoleMessages) {
         JSC::JSGlobalObject* lexicalGlobalObject = message->globalObject();
         if (!lexicalGlobalObject)
@@ -69,9 +66,6 @@
 
 void WebConsoleAgent::didReceiveResponse(unsigned long requestIdentifier, const ResourceResponse& response)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     if (response.httpStatusCode() >= 400) {
         String message = makeString("Failed to load resource: the server responded with a status of ", response.httpStatusCode(), " (", response.httpStatusText(), ')');
         addMessageToConsole(makeUnique<ConsoleMessage>(MessageSource::Network, MessageType::Log, MessageLevel::Error, message, response.url().string(), 0, 0, nullptr, requestIdentifier));
@@ -80,9 +74,6 @@
 
 void WebConsoleAgent::didFailLoading(unsigned long requestIdentifier, const ResourceError& error)
 {
-    if (!m_injectedScriptManager.inspectorEnvironment().developerExtrasEnabled())
-        return;
-
     // Report failures only.
     if (error.isCancellation())
         return;
diff --git a/Source/WebCore/page/PageConsoleClient.cpp b/Source/WebCore/page/PageConsoleClient.cpp
index 41023d9..4c35330 100644
--- a/Source/WebCore/page/PageConsoleClient.cpp
+++ b/Source/WebCore/page/PageConsoleClient.cpp
@@ -272,6 +272,9 @@
 
 void PageConsoleClient::record(JSC::JSGlobalObject* lexicalGlobalObject, Ref<ScriptArguments>&& arguments)
 {
+    if (LIKELY(!InspectorInstrumentation::hasFrontends()))
+        return;
+
     if (auto* target = objectArgumentAt(arguments, 0)) {
         if (auto* context = canvasRenderingContext(lexicalGlobalObject->vm(), target))
             InspectorInstrumentation::consoleStartRecordingCanvas(*context, *lexicalGlobalObject, objectArgumentAt(arguments, 1));
@@ -280,9 +283,12 @@
 
 void PageConsoleClient::recordEnd(JSC::JSGlobalObject* lexicalGlobalObject, Ref<ScriptArguments>&& arguments)
 {
+    if (LIKELY(!InspectorInstrumentation::hasFrontends()))
+        return;
+
     if (auto* target = objectArgumentAt(arguments, 0)) {
         if (auto* context = canvasRenderingContext(lexicalGlobalObject->vm(), target))
-            InspectorInstrumentation::didFinishRecordingCanvasFrame(*context, true);
+            InspectorInstrumentation::consoleStopRecordingCanvas(*context);
     }
 }