1/*
2* Copyright (C) 2011 Google Inc. All rights reserved.
3* Copyright (C) 2014-2017 Apple Inc. All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are
7* met:
8*
9* * Redistributions of source code must retain the above copyright
10* notice, this list of conditions and the following disclaimer.
11* * Redistributions in binary form must reproduce the above
12* copyright notice, this list of conditions and the following disclaimer
13* in the documentation and/or other materials provided with the
14* distribution.
15* * Neither the name of Google Inc. nor the names of its
16* contributors may be used to endorse or promote products derived from
17* this software without specific prior written permission.
18*
19* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*/
31
32#include "config.h"
33#include "InspectorInstrumentation.h"
34
35#include "CachedResource.h"
36#include "DOMWindow.h"
37#include "DOMWrapperWorld.h"
38#include "DocumentLoader.h"
39#include "Event.h"
40#include "Frame.h"
41#include "InspectorApplicationCacheAgent.h"
42#include "InspectorCSSAgent.h"
43#include "InspectorCanvasAgent.h"
44#include "InspectorDOMAgent.h"
45#include "InspectorDOMDebuggerAgent.h"
46#include "InspectorDOMStorageAgent.h"
47#include "InspectorDatabaseAgent.h"
48#include "InspectorLayerTreeAgent.h"
49#include "InspectorMemoryAgent.h"
50#include "InspectorNetworkAgent.h"
51#include "InspectorPageAgent.h"
52#include "InspectorTimelineAgent.h"
53#include "InspectorWorkerAgent.h"
54#include "InstrumentingAgents.h"
55#include "LoaderStrategy.h"
56#include "PageDebuggerAgent.h"
57#include "PageHeapAgent.h"
58#include "PageRuntimeAgent.h"
59#include "PlatformStrategies.h"
60#include "RenderObject.h"
61#include "RenderView.h"
62#include "ScriptController.h"
63#include "ScriptExecutionContext.h"
64#include "WebConsoleAgent.h"
65#include "WebGLRenderingContextBase.h"
66#include "WebSocketFrame.h"
67#include <JavaScriptCore/ConsoleMessage.h>
68#include <JavaScriptCore/ConsoleTypes.h>
69#include <JavaScriptCore/InspectorDebuggerAgent.h>
70#include <JavaScriptCore/ScriptArguments.h>
71#include <JavaScriptCore/ScriptCallStack.h>
72#include <wtf/StdLibExtras.h>
73
74namespace WebCore {
75
76using namespace Inspector;
77
78namespace {
79static HashSet<InstrumentingAgents*>* s_instrumentingAgentsSet = nullptr;
80}
81
82int InspectorInstrumentation::s_frontendCounter = 0;
83
84void InspectorInstrumentation::firstFrontendCreated()
85{
86 platformStrategies()->loaderStrategy()->setCaptureExtraNetworkLoadMetricsEnabled(true);
87}
88
89void InspectorInstrumentation::lastFrontendDeleted()
90{
91 platformStrategies()->loaderStrategy()->setCaptureExtraNetworkLoadMetricsEnabled(false);
92}
93
94static Frame* frameForScriptExecutionContext(ScriptExecutionContext* context)
95{
96 Frame* frame = nullptr;
97 if (is<Document>(*context))
98 frame = downcast<Document>(*context).frame();
99 return frame;
100}
101
102static Frame* frameForScriptExecutionContext(ScriptExecutionContext& context)
103{
104 Frame* frame = nullptr;
105 if (is<Document>(context))
106 frame = downcast<Document>(context).frame();
107 return frame;
108}
109
110void InspectorInstrumentation::didClearWindowObjectInWorldImpl(InstrumentingAgents& instrumentingAgents, Frame& frame, DOMWrapperWorld& world)
111{
112 if (PageDebuggerAgent* debuggerAgent = instrumentingAgents.pageDebuggerAgent()) {
113 if (&world == &mainThreadNormalWorld() && frame.isMainFrame())
114 debuggerAgent->didClearMainFrameWindowObject();
115 }
116
117 if (PageRuntimeAgent* pageRuntimeAgent = instrumentingAgents.pageRuntimeAgent()) {
118 if (&world == &mainThreadNormalWorld())
119 pageRuntimeAgent->didCreateMainWorldContext(frame);
120 }
121}
122
123bool InspectorInstrumentation::isDebuggerPausedImpl(InstrumentingAgents& instrumentingAgents)
124{
125 if (InspectorDebuggerAgent* debuggerAgent = instrumentingAgents.inspectorDebuggerAgent())
126 return debuggerAgent->isPaused();
127 return false;
128}
129
130int InspectorInstrumentation::identifierForNodeImpl(InstrumentingAgents& instrumentingAgents, Node& node)
131{
132 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
133 return domAgent->identifierForNode(node);
134 return 0;
135}
136
137void InspectorInstrumentation::addEventListenersToNodeImpl(InstrumentingAgents& instrumentingAgents, Node& node)
138{
139 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
140 domAgent->addEventListenersToNode(node);
141}
142
143void InspectorInstrumentation::willInsertDOMNodeImpl(InstrumentingAgents& instrumentingAgents, Node& parent)
144{
145 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
146 domDebuggerAgent->willInsertDOMNode(parent);
147}
148
149void InspectorInstrumentation::didInsertDOMNodeImpl(InstrumentingAgents& instrumentingAgents, Node& node)
150{
151 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
152 domAgent->didInsertDOMNode(node);
153 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
154 domDebuggerAgent->didInsertDOMNode(node);
155}
156
157void InspectorInstrumentation::willRemoveDOMNodeImpl(InstrumentingAgents& instrumentingAgents, Node& node)
158{
159 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
160 domDebuggerAgent->willRemoveDOMNode(node);
161}
162
163void InspectorInstrumentation::didRemoveDOMNodeImpl(InstrumentingAgents& instrumentingAgents, Node& node)
164{
165 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
166 domDebuggerAgent->didRemoveDOMNode(node);
167 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
168 domAgent->didRemoveDOMNode(node);
169}
170
171void InspectorInstrumentation::willModifyDOMAttrImpl(InstrumentingAgents& instrumentingAgents, Element& element, const AtomicString& oldValue, const AtomicString& newValue)
172{
173 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
174 domDebuggerAgent->willModifyDOMAttr(element);
175 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
176 domAgent->willModifyDOMAttr(element, oldValue, newValue);
177}
178
179void InspectorInstrumentation::didModifyDOMAttrImpl(InstrumentingAgents& instrumentingAgents, Element& element, const AtomicString& name, const AtomicString& value)
180{
181 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
182 domAgent->didModifyDOMAttr(element, name, value);
183}
184
185void InspectorInstrumentation::didRemoveDOMAttrImpl(InstrumentingAgents& instrumentingAgents, Element& element, const AtomicString& name)
186{
187 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
188 domAgent->didRemoveDOMAttr(element, name);
189}
190
191void InspectorInstrumentation::willInvalidateStyleAttrImpl(InstrumentingAgents& instrumentingAgents, Element& element)
192{
193 if (auto* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
194 domDebuggerAgent->willInvalidateStyleAttr(element);
195}
196
197void InspectorInstrumentation::didInvalidateStyleAttrImpl(InstrumentingAgents& instrumentingAgents, Element& element)
198{
199 if (auto* domAgent = instrumentingAgents.inspectorDOMAgent())
200 domAgent->didInvalidateStyleAttr(element);
201}
202
203void InspectorInstrumentation::documentDetachedImpl(InstrumentingAgents& instrumentingAgents, Document& document)
204{
205 if (InspectorCSSAgent* cssAgent = instrumentingAgents.inspectorCSSAgent())
206 cssAgent->documentDetached(document);
207}
208
209void InspectorInstrumentation::frameWindowDiscardedImpl(InstrumentingAgents& instrumentingAgents, DOMWindow* window)
210{
211 if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
212 return;
213
214 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
215 consoleAgent->frameWindowDiscarded(window);
216}
217
218void InspectorInstrumentation::mediaQueryResultChangedImpl(InstrumentingAgents& instrumentingAgents)
219{
220 if (InspectorCSSAgent* cssAgent = instrumentingAgents.inspectorCSSAgent())
221 cssAgent->mediaQueryResultChanged();
222}
223
224void InspectorInstrumentation::activeStyleSheetsUpdatedImpl(InstrumentingAgents& instrumentingAgents, Document& document)
225{
226 if (InspectorCSSAgent* cssAgent = instrumentingAgents.inspectorCSSAgent())
227 cssAgent->activeStyleSheetsUpdated(document);
228}
229
230void InspectorInstrumentation::didPushShadowRootImpl(InstrumentingAgents& instrumentingAgents, Element& host, ShadowRoot& root)
231{
232 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
233 domAgent->didPushShadowRoot(host, root);
234}
235
236void InspectorInstrumentation::willPopShadowRootImpl(InstrumentingAgents& instrumentingAgents, Element& host, ShadowRoot& root)
237{
238 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
239 domAgent->willPopShadowRoot(host, root);
240}
241
242void InspectorInstrumentation::didChangeCustomElementStateImpl(InstrumentingAgents& instrumentingAgents, Element& element)
243{
244 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
245 domAgent->didChangeCustomElementState(element);
246}
247
248void InspectorInstrumentation::pseudoElementCreatedImpl(InstrumentingAgents& instrumentingAgents, PseudoElement& pseudoElement)
249{
250 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
251 domAgent->pseudoElementCreated(pseudoElement);
252}
253
254void InspectorInstrumentation::pseudoElementDestroyedImpl(InstrumentingAgents& instrumentingAgents, PseudoElement& pseudoElement)
255{
256 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
257 domAgent->pseudoElementDestroyed(pseudoElement);
258 if (InspectorLayerTreeAgent* layerTreeAgent = instrumentingAgents.inspectorLayerTreeAgent())
259 layerTreeAgent->pseudoElementDestroyed(pseudoElement);
260}
261
262void InspectorInstrumentation::mouseDidMoveOverElementImpl(InstrumentingAgents& instrumentingAgents, const HitTestResult& result, unsigned modifierFlags)
263{
264 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
265 domAgent->mouseDidMoveOverElement(result, modifierFlags);
266}
267
268void InspectorInstrumentation::didScrollImpl(InstrumentingAgents& instrumentingAgents)
269{
270 if (InspectorPageAgent* pageAgent = instrumentingAgents.inspectorPageAgent())
271 pageAgent->didScroll();
272}
273
274bool InspectorInstrumentation::handleTouchEventImpl(InstrumentingAgents& instrumentingAgents, Node& node)
275{
276 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
277 return domAgent->handleTouchEvent(node);
278 return false;
279}
280
281bool InspectorInstrumentation::handleMousePressImpl(InstrumentingAgents& instrumentingAgents)
282{
283 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
284 return domAgent->handleMousePress();
285 return false;
286}
287
288bool InspectorInstrumentation::forcePseudoStateImpl(InstrumentingAgents& instrumentingAgents, const Element& element, CSSSelector::PseudoClassType pseudoState)
289{
290 if (InspectorCSSAgent* cssAgent = instrumentingAgents.inspectorCSSAgent())
291 return cssAgent->forcePseudoState(element, pseudoState);
292 return false;
293}
294
295void InspectorInstrumentation::characterDataModifiedImpl(InstrumentingAgents& instrumentingAgents, CharacterData& characterData)
296{
297 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
298 domAgent->characterDataModified(characterData);
299}
300
301void InspectorInstrumentation::willSendXMLHttpRequestImpl(InstrumentingAgents& instrumentingAgents, const String& url)
302{
303 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
304 domDebuggerAgent->willSendXMLHttpRequest(url);
305}
306
307void InspectorInstrumentation::willFetchImpl(InstrumentingAgents& instrumentingAgents, const String& url)
308{
309 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
310 domDebuggerAgent->willFetch(url);
311}
312
313void InspectorInstrumentation::didInstallTimerImpl(InstrumentingAgents& instrumentingAgents, int timerId, Seconds timeout, bool singleShot, ScriptExecutionContext& context)
314{
315 if (InspectorDebuggerAgent* debuggerAgent = instrumentingAgents.inspectorDebuggerAgent())
316 debuggerAgent->didScheduleAsyncCall(context.execState(), InspectorDebuggerAgent::AsyncCallType::DOMTimer, timerId, singleShot);
317
318 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
319 timelineAgent->didInstallTimer(timerId, timeout, singleShot, frameForScriptExecutionContext(context));
320}
321
322void InspectorInstrumentation::didRemoveTimerImpl(InstrumentingAgents& instrumentingAgents, int timerId, ScriptExecutionContext& context)
323{
324 if (InspectorDebuggerAgent* debuggerAgent = instrumentingAgents.inspectorDebuggerAgent())
325 debuggerAgent->didCancelAsyncCall(InspectorDebuggerAgent::AsyncCallType::DOMTimer, timerId);
326 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
327 timelineAgent->didRemoveTimer(timerId, frameForScriptExecutionContext(context));
328}
329
330void InspectorInstrumentation::didAddEventListenerImpl(InstrumentingAgents& instrumentingAgents, EventTarget& target, const AtomicString& eventType, EventListener& listener, bool capture)
331{
332 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
333 pageDebuggerAgent->didAddEventListener(target, eventType, listener, capture);
334 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
335 domAgent->didAddEventListener(target);
336}
337
338void InspectorInstrumentation::willRemoveEventListenerImpl(InstrumentingAgents& instrumentingAgents, EventTarget& target, const AtomicString& eventType, EventListener& listener, bool capture)
339{
340 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
341 pageDebuggerAgent->willRemoveEventListener(target, eventType, listener, capture);
342 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
343 domAgent->willRemoveEventListener(target, eventType, listener, capture);
344}
345
346bool InspectorInstrumentation::isEventListenerDisabledImpl(InstrumentingAgents& instrumentingAgents, EventTarget& target, const AtomicString& eventType, EventListener& listener, bool capture)
347{
348 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
349 return domAgent->isEventListenerDisabled(target, eventType, listener, capture);
350 return false;
351}
352
353void InspectorInstrumentation::didPostMessageImpl(InstrumentingAgents& instrumentingAgents, const TimerBase& timer, JSC::ExecState& state)
354{
355 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
356 pageDebuggerAgent->didPostMessage(timer, state);
357}
358
359void InspectorInstrumentation::didFailPostMessageImpl(InstrumentingAgents& instrumentingAgents, const TimerBase& timer)
360{
361 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
362 pageDebuggerAgent->didFailPostMessage(timer);
363}
364
365void InspectorInstrumentation::willDispatchPostMessageImpl(InstrumentingAgents& instrumentingAgents, const TimerBase& timer)
366{
367 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
368 pageDebuggerAgent->willDispatchPostMessage(timer);
369}
370
371void InspectorInstrumentation::didDispatchPostMessageImpl(InstrumentingAgents& instrumentingAgents, const TimerBase& timer)
372{
373 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
374 pageDebuggerAgent->didDispatchPostMessage(timer);
375}
376
377InspectorInstrumentationCookie InspectorInstrumentation::willCallFunctionImpl(InstrumentingAgents& instrumentingAgents, const String& scriptName, int scriptLine, int scriptColumn, ScriptExecutionContext* context)
378{
379 int timelineAgentId = 0;
380 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent()) {
381 timelineAgent->willCallFunction(scriptName, scriptLine, scriptColumn, frameForScriptExecutionContext(context));
382 timelineAgentId = timelineAgent->id();
383 }
384 return InspectorInstrumentationCookie(instrumentingAgents, timelineAgentId);
385}
386
387void InspectorInstrumentation::didCallFunctionImpl(const InspectorInstrumentationCookie& cookie, ScriptExecutionContext* context)
388{
389 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie))
390 timelineAgent->didCallFunction(frameForScriptExecutionContext(context));
391}
392
393InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEventImpl(InstrumentingAgents& instrumentingAgents, Document& document, const Event& event, bool hasEventListeners)
394{
395 int timelineAgentId = 0;
396 InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent();
397 if (timelineAgent && hasEventListeners) {
398 timelineAgent->willDispatchEvent(event, document.frame());
399 timelineAgentId = timelineAgent->id();
400 }
401
402 return InspectorInstrumentationCookie(instrumentingAgents, timelineAgentId);
403}
404
405void InspectorInstrumentation::willHandleEventImpl(InstrumentingAgents& instrumentingAgents, Event& event, const RegisteredEventListener& listener)
406{
407 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
408 pageDebuggerAgent->willHandleEvent(listener);
409
410 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
411 domDebuggerAgent->willHandleEvent(event, listener);
412}
413
414void InspectorInstrumentation::didHandleEventImpl(InstrumentingAgents& instrumentingAgents)
415{
416 if (InspectorDebuggerAgent* debuggerAgent = instrumentingAgents.inspectorDebuggerAgent())
417 debuggerAgent->didDispatchAsyncCall();
418
419 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
420 domDebuggerAgent->didHandleEvent();
421}
422
423void InspectorInstrumentation::didDispatchEventImpl(const InspectorInstrumentationCookie& cookie, bool defaultPrevented)
424{
425 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie))
426 timelineAgent->didDispatchEvent(defaultPrevented);
427}
428
429InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEventOnWindowImpl(InstrumentingAgents& instrumentingAgents, const Event& event, DOMWindow& window)
430{
431 int timelineAgentId = 0;
432 InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent();
433 if (timelineAgent && window.hasEventListeners(event.type())) {
434 timelineAgent->willDispatchEvent(event, window.frame());
435 timelineAgentId = timelineAgent->id();
436 }
437
438 return InspectorInstrumentationCookie(instrumentingAgents, timelineAgentId);
439}
440
441void InspectorInstrumentation::didDispatchEventOnWindowImpl(const InspectorInstrumentationCookie& cookie, bool defaultPrevented)
442{
443 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie))
444 timelineAgent->didDispatchEvent(defaultPrevented);
445}
446
447void InspectorInstrumentation::eventDidResetAfterDispatchImpl(InstrumentingAgents& instrumentingAgents, const Event& event)
448{
449 if (auto* domAgent = instrumentingAgents.inspectorDOMAgent())
450 domAgent->eventDidResetAfterDispatch(event);
451}
452
453InspectorInstrumentationCookie InspectorInstrumentation::willEvaluateScriptImpl(InstrumentingAgents& instrumentingAgents, Frame& frame, const String& url, int lineNumber, int columnNumber)
454{
455 int timelineAgentId = 0;
456 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent()) {
457 timelineAgent->willEvaluateScript(url, lineNumber, columnNumber, frame);
458 timelineAgentId = timelineAgent->id();
459 }
460 return InspectorInstrumentationCookie(instrumentingAgents, timelineAgentId);
461}
462
463void InspectorInstrumentation::didEvaluateScriptImpl(const InspectorInstrumentationCookie& cookie, Frame& frame)
464{
465 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie))
466 timelineAgent->didEvaluateScript(frame);
467}
468
469InspectorInstrumentationCookie InspectorInstrumentation::willFireTimerImpl(InstrumentingAgents& instrumentingAgents, int timerId, bool oneShot, ScriptExecutionContext& context)
470{
471 if (InspectorDebuggerAgent* debuggerAgent = instrumentingAgents.inspectorDebuggerAgent())
472 debuggerAgent->willDispatchAsyncCall(InspectorDebuggerAgent::AsyncCallType::DOMTimer, timerId);
473
474 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
475 domDebuggerAgent->willFireTimer(oneShot);
476
477 int timelineAgentId = 0;
478 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent()) {
479 timelineAgent->willFireTimer(timerId, frameForScriptExecutionContext(context));
480 timelineAgentId = timelineAgent->id();
481 }
482 return InspectorInstrumentationCookie(instrumentingAgents, timelineAgentId);
483}
484
485void InspectorInstrumentation::didFireTimerImpl(const InspectorInstrumentationCookie& cookie)
486{
487 if (InspectorDebuggerAgent* debuggerAgent = cookie.instrumentingAgents()->inspectorDebuggerAgent())
488 debuggerAgent->didDispatchAsyncCall();
489 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie))
490 timelineAgent->didFireTimer();
491}
492
493void InspectorInstrumentation::didInvalidateLayoutImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
494{
495 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
496 timelineAgent->didInvalidateLayout(frame);
497}
498
499InspectorInstrumentationCookie InspectorInstrumentation::willLayoutImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
500{
501 int timelineAgentId = 0;
502 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent()) {
503 timelineAgent->willLayout(frame);
504 timelineAgentId = timelineAgent->id();
505 }
506 return InspectorInstrumentationCookie(instrumentingAgents, timelineAgentId);
507}
508
509void InspectorInstrumentation::didLayoutImpl(const InspectorInstrumentationCookie& cookie, RenderObject& root)
510{
511 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie))
512 timelineAgent->didLayout(root);
513
514 if (InspectorPageAgent* pageAgent = cookie.instrumentingAgents()->inspectorPageAgent())
515 pageAgent->didLayout();
516}
517
518void InspectorInstrumentation::willCompositeImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
519{
520 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
521 timelineAgent->willComposite(frame);
522}
523
524void InspectorInstrumentation::didCompositeImpl(InstrumentingAgents& instrumentingAgents)
525{
526 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
527 timelineAgent->didComposite();
528}
529
530void InspectorInstrumentation::willPaintImpl(InstrumentingAgents& instrumentingAgents, RenderObject& renderer)
531{
532 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
533 timelineAgent->willPaint(renderer.frame());
534}
535
536void InspectorInstrumentation::didPaintImpl(InstrumentingAgents& instrumentingAgents, RenderObject& renderer, const LayoutRect& rect)
537{
538 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
539 timelineAgent->didPaint(renderer, rect);
540
541 if (InspectorPageAgent* pageAgent = instrumentingAgents.inspectorPageAgent())
542 pageAgent->didPaint(renderer, rect);
543}
544
545InspectorInstrumentationCookie InspectorInstrumentation::willRecalculateStyleImpl(InstrumentingAgents& instrumentingAgents, Document& document)
546{
547 int timelineAgentId = 0;
548 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent()) {
549 timelineAgent->willRecalculateStyle(document.frame());
550 timelineAgentId = timelineAgent->id();
551 }
552 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
553 networkAgent->willRecalculateStyle();
554 return InspectorInstrumentationCookie(instrumentingAgents, timelineAgentId);
555}
556
557void InspectorInstrumentation::didRecalculateStyleImpl(const InspectorInstrumentationCookie& cookie)
558{
559 if (!cookie.isValid())
560 return;
561
562 InstrumentingAgents& instrumentingAgents = *cookie.instrumentingAgents();
563
564 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie))
565 timelineAgent->didRecalculateStyle();
566 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
567 networkAgent->didRecalculateStyle();
568 if (InspectorPageAgent* pageAgent = instrumentingAgents.inspectorPageAgent())
569 pageAgent->didRecalculateStyle();
570}
571
572void InspectorInstrumentation::didScheduleStyleRecalculationImpl(InstrumentingAgents& instrumentingAgents, Document& document)
573{
574 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
575 timelineAgent->didScheduleStyleRecalculation(document.frame());
576 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
577 networkAgent->didScheduleStyleRecalculation(document);
578}
579
580void InspectorInstrumentation::applyUserAgentOverrideImpl(InstrumentingAgents& instrumentingAgents, String& userAgent)
581{
582 if (InspectorPageAgent* pageAgent = instrumentingAgents.inspectorPageAgent())
583 pageAgent->applyUserAgentOverride(userAgent);
584}
585
586void InspectorInstrumentation::applyEmulatedMediaImpl(InstrumentingAgents& instrumentingAgents, String& media)
587{
588 if (InspectorPageAgent* pageAgent = instrumentingAgents.inspectorPageAgent())
589 pageAgent->applyEmulatedMedia(media);
590}
591
592void InspectorInstrumentation::willSendRequestImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, DocumentLoader* loader, ResourceRequest& request, const ResourceResponse& redirectResponse)
593{
594 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
595 networkAgent->willSendRequest(identifier, loader, request, redirectResponse);
596}
597
598void InspectorInstrumentation::willSendRequestOfTypeImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, DocumentLoader* loader, ResourceRequest& request, LoadType loadType)
599{
600 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
601 networkAgent->willSendRequestOfType(identifier, loader, request, loadType);
602}
603
604void InspectorInstrumentation::didLoadResourceFromMemoryCacheImpl(InstrumentingAgents& instrumentingAgents, DocumentLoader* loader, CachedResource* cachedResource)
605{
606 if (!loader || !cachedResource)
607 return;
608
609 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
610 networkAgent->didLoadResourceFromMemoryCache(loader, *cachedResource);
611}
612
613void InspectorInstrumentation::didReceiveResourceResponseImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, ResourceLoader* resourceLoader)
614{
615 if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
616 return;
617
618 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
619 networkAgent->didReceiveResponse(identifier, loader, response, resourceLoader);
620 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
621 consoleAgent->didReceiveResponse(identifier, response); // This should come AFTER resource notification, front-end relies on this.
622}
623
624void InspectorInstrumentation::didReceiveThreadableLoaderResponseImpl(InstrumentingAgents& instrumentingAgents, DocumentThreadableLoader& documentThreadableLoader, unsigned long identifier)
625{
626 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
627 networkAgent->didReceiveThreadableLoaderResponse(identifier, documentThreadableLoader);
628}
629
630void InspectorInstrumentation::didReceiveDataImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, const char* data, int dataLength, int encodedDataLength)
631{
632 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
633 networkAgent->didReceiveData(identifier, data, dataLength, encodedDataLength);
634}
635
636void InspectorInstrumentation::didFinishLoadingImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, DocumentLoader* loader, const NetworkLoadMetrics& networkLoadMetrics, ResourceLoader* resourceLoader)
637{
638 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
639 networkAgent->didFinishLoading(identifier, loader, networkLoadMetrics, resourceLoader);
640}
641
642void InspectorInstrumentation::didFailLoadingImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, DocumentLoader* loader, const ResourceError& error)
643{
644 if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
645 return;
646
647 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
648 networkAgent->didFailLoading(identifier, loader, error);
649 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
650 consoleAgent->didFailLoading(identifier, error); // This should come AFTER resource notification, front-end relies on this.
651}
652
653void InspectorInstrumentation::willLoadXHRSynchronouslyImpl(InstrumentingAgents& instrumentingAgents)
654{
655 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
656 networkAgent->willLoadXHRSynchronously();
657}
658
659void InspectorInstrumentation::didLoadXHRSynchronouslyImpl(InstrumentingAgents& instrumentingAgents)
660{
661 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
662 networkAgent->didLoadXHRSynchronously();
663}
664
665void InspectorInstrumentation::scriptImportedImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, const String& sourceString)
666{
667 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
668 networkAgent->setInitialScriptContent(identifier, sourceString);
669}
670
671void InspectorInstrumentation::scriptExecutionBlockedByCSPImpl(InstrumentingAgents& instrumentingAgents, const String& directiveText)
672{
673 if (InspectorDebuggerAgent* debuggerAgent = instrumentingAgents.inspectorDebuggerAgent())
674 debuggerAgent->scriptExecutionBlockedByCSP(directiveText);
675}
676
677void InspectorInstrumentation::didReceiveScriptResponseImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier)
678{
679 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
680 networkAgent->didReceiveScriptResponse(identifier);
681}
682
683void InspectorInstrumentation::domContentLoadedEventFiredImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
684{
685 if (!frame.isMainFrame())
686 return;
687
688 if (InspectorPageAgent* pageAgent = instrumentingAgents.inspectorPageAgent())
689 pageAgent->domContentEventFired();
690}
691
692void InspectorInstrumentation::loadEventFiredImpl(InstrumentingAgents& instrumentingAgents, Frame* frame)
693{
694 if (!frame || !frame->isMainFrame())
695 return;
696
697 if (InspectorPageAgent* pageAgent = instrumentingAgents.inspectorPageAgent())
698 pageAgent->loadEventFired();
699}
700
701void InspectorInstrumentation::frameDetachedFromParentImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
702{
703 if (InspectorPageAgent* pageAgent = instrumentingAgents.inspectorPageAgent())
704 pageAgent->frameDetached(frame);
705}
706
707void InspectorInstrumentation::didCommitLoadImpl(InstrumentingAgents& instrumentingAgents, Frame& frame, DocumentLoader* loader)
708{
709 if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
710 return;
711
712 if (!frame.page())
713 return;
714
715 if (!loader)
716 return;
717
718 ASSERT(loader->frame() == &frame);
719
720 if (frame.isMainFrame()) {
721 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
722 consoleAgent->reset();
723
724 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
725 networkAgent->mainFrameNavigated(*loader);
726
727 if (InspectorCSSAgent* cssAgent = instrumentingAgents.inspectorCSSAgent())
728 cssAgent->reset();
729
730 if (auto* databaseAgent = instrumentingAgents.inspectorDatabaseAgent())
731 databaseAgent->didCommitLoad();
732
733 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
734 domAgent->setDocument(frame.document());
735
736 if (InspectorLayerTreeAgent* layerTreeAgent = instrumentingAgents.inspectorLayerTreeAgent())
737 layerTreeAgent->reset();
738
739 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
740 pageDebuggerAgent->mainFrameNavigated();
741
742 if (PageHeapAgent* pageHeapAgent = instrumentingAgents.pageHeapAgent())
743 pageHeapAgent->mainFrameNavigated();
744 }
745
746 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
747 canvasAgent->frameNavigated(frame);
748
749 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
750 domAgent->didCommitLoad(frame.document());
751
752 if (InspectorPageAgent* pageAgent = instrumentingAgents.inspectorPageAgent())
753 pageAgent->frameNavigated(frame);
754
755 if (frame.isMainFrame()) {
756 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
757 timelineAgent->mainFrameNavigated();
758 }
759}
760
761void InspectorInstrumentation::frameDocumentUpdatedImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
762{
763 if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
764 domAgent->frameDocumentUpdated(frame);
765
766 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
767 domDebuggerAgent->frameDocumentUpdated(frame);
768}
769
770void InspectorInstrumentation::loaderDetachedFromFrameImpl(InstrumentingAgents& instrumentingAgents, DocumentLoader& loader)
771{
772 if (InspectorPageAgent* inspectorPageAgent = instrumentingAgents.inspectorPageAgent())
773 inspectorPageAgent->loaderDetachedFromFrame(loader);
774}
775
776void InspectorInstrumentation::frameStartedLoadingImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
777{
778 if (frame.isMainFrame()) {
779 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
780 pageDebuggerAgent->mainFrameStartedLoading();
781 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.persistentInspectorTimelineAgent())
782 timelineAgent->mainFrameStartedLoading();
783 }
784
785 if (InspectorPageAgent* inspectorPageAgent = instrumentingAgents.inspectorPageAgent())
786 inspectorPageAgent->frameStartedLoading(frame);
787}
788
789void InspectorInstrumentation::frameStoppedLoadingImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
790{
791 if (frame.isMainFrame()) {
792 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
793 pageDebuggerAgent->mainFrameStoppedLoading();
794 }
795
796 if (InspectorPageAgent* inspectorPageAgent = instrumentingAgents.inspectorPageAgent())
797 inspectorPageAgent->frameStoppedLoading(frame);
798}
799
800void InspectorInstrumentation::frameScheduledNavigationImpl(InstrumentingAgents& instrumentingAgents, Frame& frame, Seconds delay)
801{
802 if (InspectorPageAgent* inspectorPageAgent = instrumentingAgents.inspectorPageAgent())
803 inspectorPageAgent->frameScheduledNavigation(frame, delay);
804}
805
806void InspectorInstrumentation::frameClearedScheduledNavigationImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
807{
808 if (InspectorPageAgent* inspectorPageAgent = instrumentingAgents.inspectorPageAgent())
809 inspectorPageAgent->frameClearedScheduledNavigation(frame);
810}
811
812void InspectorInstrumentation::defaultAppearanceDidChangeImpl(InstrumentingAgents& instrumentingAgents, bool useDarkAppearance)
813{
814 if (InspectorPageAgent* inspectorPageAgent = instrumentingAgents.inspectorPageAgent())
815 inspectorPageAgent->defaultAppearanceDidChange(useDarkAppearance);
816}
817
818void InspectorInstrumentation::willDestroyCachedResourceImpl(CachedResource& cachedResource)
819{
820 if (!s_instrumentingAgentsSet)
821 return;
822
823 for (auto* instrumentingAgent : *s_instrumentingAgentsSet) {
824 if (InspectorNetworkAgent* inspectorNetworkAgent = instrumentingAgent->inspectorNetworkAgent())
825 inspectorNetworkAgent->willDestroyCachedResource(cachedResource);
826 }
827}
828
829// JavaScriptCore InspectorDebuggerAgent should know Console MessageTypes.
830static bool isConsoleAssertMessage(MessageSource source, MessageType type)
831{
832 return source == MessageSource::ConsoleAPI && type == MessageType::Assert;
833}
834
835void InspectorInstrumentation::addMessageToConsoleImpl(InstrumentingAgents& instrumentingAgents, std::unique_ptr<ConsoleMessage> message)
836{
837 if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
838 return;
839
840 MessageSource source = message->source();
841 MessageType type = message->type();
842 String messageText = message->message();
843
844 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
845 consoleAgent->addMessageToConsole(WTFMove(message));
846 // FIXME: This should just pass the message on to the debugger agent. JavaScriptCore InspectorDebuggerAgent should know Console MessageTypes.
847 if (InspectorDebuggerAgent* debuggerAgent = instrumentingAgents.inspectorDebuggerAgent()) {
848 if (isConsoleAssertMessage(source, type))
849 debuggerAgent->handleConsoleAssert(messageText);
850 }
851}
852
853void InspectorInstrumentation::consoleCountImpl(InstrumentingAgents& instrumentingAgents, JSC::ExecState* state, Ref<ScriptArguments>&& arguments)
854{
855 if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
856 return;
857
858 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
859 consoleAgent->count(state, WTFMove(arguments));
860}
861
862void InspectorInstrumentation::takeHeapSnapshotImpl(InstrumentingAgents& instrumentingAgents, const String& title)
863{
864 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
865 consoleAgent->takeHeapSnapshot(title);
866}
867
868void InspectorInstrumentation::startConsoleTimingImpl(InstrumentingAgents& instrumentingAgents, Frame& frame, const String& title)
869{
870 if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
871 return;
872
873 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
874 timelineAgent->time(frame, title);
875 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
876 consoleAgent->startTiming(title);
877}
878
879void InspectorInstrumentation::startConsoleTimingImpl(InstrumentingAgents& instrumentingAgents, const String& title)
880{
881 if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
882 return;
883
884 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
885 consoleAgent->startTiming(title);
886}
887
888void InspectorInstrumentation::stopConsoleTimingImpl(InstrumentingAgents& instrumentingAgents, Frame& frame, const String& title, Ref<ScriptCallStack>&& stack)
889{
890 if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
891 return;
892
893 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
894 consoleAgent->stopTiming(title, WTFMove(stack));
895 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
896 timelineAgent->timeEnd(frame, title);
897}
898
899void InspectorInstrumentation::stopConsoleTimingImpl(InstrumentingAgents& instrumentingAgents, const String& title, Ref<ScriptCallStack>&& stack)
900{
901 if (!instrumentingAgents.inspectorEnvironment().developerExtrasEnabled())
902 return;
903
904 if (WebConsoleAgent* consoleAgent = instrumentingAgents.webConsoleAgent())
905 consoleAgent->stopTiming(title, WTFMove(stack));
906}
907
908void InspectorInstrumentation::consoleTimeStampImpl(InstrumentingAgents& instrumentingAgents, Frame& frame, Ref<ScriptArguments>&& arguments)
909{
910 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent()) {
911 String message;
912 arguments->getFirstArgumentAsString(message);
913 timelineAgent->didTimeStamp(frame, message);
914 }
915}
916
917void InspectorInstrumentation::startProfilingImpl(InstrumentingAgents& instrumentingAgents, JSC::ExecState* exec, const String& title)
918{
919 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.persistentInspectorTimelineAgent())
920 timelineAgent->startFromConsole(exec, title);
921}
922
923void InspectorInstrumentation::stopProfilingImpl(InstrumentingAgents& instrumentingAgents, JSC::ExecState* exec, const String& title)
924{
925 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.persistentInspectorTimelineAgent())
926 timelineAgent->stopFromConsole(exec, title);
927}
928
929void InspectorInstrumentation::consoleStartRecordingCanvasImpl(InstrumentingAgents& instrumentingAgents, CanvasRenderingContext& context, JSC::ExecState& exec, JSC::JSObject* options)
930{
931 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
932 canvasAgent->consoleStartRecordingCanvas(context, exec, options);
933}
934
935void InspectorInstrumentation::didOpenDatabaseImpl(InstrumentingAgents& instrumentingAgents, Database& database)
936{
937 if (auto* databaseAgent = instrumentingAgents.inspectorDatabaseAgent())
938 databaseAgent->didOpenDatabase(database);
939}
940
941void InspectorInstrumentation::didDispatchDOMStorageEventImpl(InstrumentingAgents& instrumentingAgents, const String& key, const String& oldValue, const String& newValue, StorageType storageType, SecurityOrigin* securityOrigin)
942{
943 if (InspectorDOMStorageAgent* domStorageAgent = instrumentingAgents.inspectorDOMStorageAgent())
944 domStorageAgent->didDispatchDOMStorageEvent(key, oldValue, newValue, storageType, securityOrigin);
945}
946
947bool InspectorInstrumentation::shouldWaitForDebuggerOnStartImpl(InstrumentingAgents& instrumentingAgents)
948{
949 if (InspectorWorkerAgent* workerAgent = instrumentingAgents.inspectorWorkerAgent())
950 return workerAgent->shouldWaitForDebuggerOnStart();
951 return false;
952}
953
954void InspectorInstrumentation::workerStartedImpl(InstrumentingAgents& instrumentingAgents, WorkerInspectorProxy* proxy, const URL& url)
955{
956 if (InspectorWorkerAgent* workerAgent = instrumentingAgents.inspectorWorkerAgent())
957 workerAgent->workerStarted(proxy, url);
958}
959
960void InspectorInstrumentation::workerTerminatedImpl(InstrumentingAgents& instrumentingAgents, WorkerInspectorProxy* proxy)
961{
962 if (InspectorWorkerAgent* workerAgent = instrumentingAgents.inspectorWorkerAgent())
963 workerAgent->workerTerminated(proxy);
964}
965
966void InspectorInstrumentation::didCreateWebSocketImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, const URL& requestURL)
967{
968 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
969 networkAgent->didCreateWebSocket(identifier, requestURL);
970}
971
972void InspectorInstrumentation::willSendWebSocketHandshakeRequestImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, const ResourceRequest& request)
973{
974 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
975 networkAgent->willSendWebSocketHandshakeRequest(identifier, request);
976}
977
978void InspectorInstrumentation::didReceiveWebSocketHandshakeResponseImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, const ResourceResponse& response)
979{
980 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
981 networkAgent->didReceiveWebSocketHandshakeResponse(identifier, response);
982}
983
984void InspectorInstrumentation::didCloseWebSocketImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier)
985{
986 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
987 networkAgent->didCloseWebSocket(identifier);
988}
989
990void InspectorInstrumentation::didReceiveWebSocketFrameImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, const WebSocketFrame& frame)
991{
992 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
993 networkAgent->didReceiveWebSocketFrame(identifier, frame);
994}
995
996void InspectorInstrumentation::didReceiveWebSocketFrameErrorImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, const String& errorMessage)
997{
998 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
999 networkAgent->didReceiveWebSocketFrameError(identifier, errorMessage);
1000}
1001
1002void InspectorInstrumentation::didSendWebSocketFrameImpl(InstrumentingAgents& instrumentingAgents, unsigned long identifier, const WebSocketFrame& frame)
1003{
1004 if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
1005 networkAgent->didSendWebSocketFrame(identifier, frame);
1006}
1007
1008void InspectorInstrumentation::didChangeCSSCanvasClientNodesImpl(InstrumentingAgents& instrumentingAgents, CanvasBase& canvasBase)
1009{
1010 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
1011 canvasAgent->didChangeCSSCanvasClientNodes(canvasBase);
1012}
1013
1014void InspectorInstrumentation::didCreateCanvasRenderingContextImpl(InstrumentingAgents& instrumentingAgents, CanvasRenderingContext& context)
1015{
1016 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
1017 canvasAgent->didCreateCanvasRenderingContext(context);
1018}
1019
1020void InspectorInstrumentation::didChangeCanvasMemoryImpl(InstrumentingAgents& instrumentingAgents, CanvasRenderingContext& context)
1021{
1022 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
1023 canvasAgent->didChangeCanvasMemory(context);
1024}
1025
1026void InspectorInstrumentation::recordCanvasActionImpl(InstrumentingAgents& instrumentingAgents, CanvasRenderingContext& canvasRenderingContext, const String& name, Vector<RecordCanvasActionVariant>&& parameters)
1027{
1028 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
1029 canvasAgent->recordCanvasAction(canvasRenderingContext, name, WTFMove(parameters));
1030}
1031
1032void InspectorInstrumentation::didFinishRecordingCanvasFrameImpl(InstrumentingAgents& instrumentingAgents, CanvasRenderingContext& context, bool forceDispatch)
1033{
1034 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
1035 canvasAgent->didFinishRecordingCanvasFrame(context, forceDispatch);
1036}
1037
1038#if ENABLE(WEBGL)
1039void InspectorInstrumentation::didEnableExtensionImpl(InstrumentingAgents& instrumentingAgents, WebGLRenderingContextBase& contextWebGLBase, const String& extension)
1040{
1041 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
1042 canvasAgent->didEnableExtension(contextWebGLBase, extension);
1043}
1044
1045void InspectorInstrumentation::didCreateProgramImpl(InstrumentingAgents& instrumentingAgents, WebGLRenderingContextBase& contextWebGLBase, WebGLProgram& program)
1046{
1047 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
1048 canvasAgent->didCreateProgram(contextWebGLBase, program);
1049}
1050
1051void InspectorInstrumentation::willDeleteProgramImpl(InstrumentingAgents& instrumentingAgents, WebGLProgram& program)
1052{
1053 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
1054 canvasAgent->willDeleteProgram(program);
1055}
1056
1057bool InspectorInstrumentation::isShaderProgramDisabledImpl(InstrumentingAgents& instrumentingAgents, WebGLProgram& program)
1058{
1059 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
1060 return canvasAgent->isShaderProgramDisabled(program);
1061 return false;
1062}
1063
1064bool InspectorInstrumentation::isShaderProgramHighlightedImpl(InstrumentingAgents& instrumentingAgents, WebGLProgram& program)
1065{
1066 if (InspectorCanvasAgent* canvasAgent = instrumentingAgents.inspectorCanvasAgent())
1067 return canvasAgent->isShaderProgramHighlighted(program);
1068 return false;
1069}
1070#endif
1071
1072#if ENABLE(RESOURCE_USAGE)
1073void InspectorInstrumentation::didHandleMemoryPressureImpl(InstrumentingAgents& instrumentingAgents, Critical critical)
1074{
1075 if (InspectorMemoryAgent* memoryAgent = instrumentingAgents.inspectorMemoryAgent())
1076 memoryAgent->didHandleMemoryPressure(critical);
1077}
1078#endif
1079
1080void InspectorInstrumentation::networkStateChangedImpl(InstrumentingAgents& instrumentingAgents)
1081{
1082 if (InspectorApplicationCacheAgent* applicationCacheAgent = instrumentingAgents.inspectorApplicationCacheAgent())
1083 applicationCacheAgent->networkStateChanged();
1084}
1085
1086void InspectorInstrumentation::updateApplicationCacheStatusImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
1087{
1088 if (auto* applicationCacheAgent = instrumentingAgents.inspectorApplicationCacheAgent())
1089 applicationCacheAgent->updateApplicationCacheStatus(&frame);
1090}
1091
1092bool InspectorInstrumentation::consoleAgentEnabled(ScriptExecutionContext* scriptExecutionContext)
1093{
1094 FAST_RETURN_IF_NO_FRONTENDS(false);
1095 if (auto* instrumentingAgents = instrumentingAgentsForContext(scriptExecutionContext)) {
1096 if (auto* webConsoleAgent = instrumentingAgents->webConsoleAgent())
1097 return webConsoleAgent->enabled();
1098 }
1099 return false;
1100}
1101
1102bool InspectorInstrumentation::timelineAgentEnabled(ScriptExecutionContext* scriptExecutionContext)
1103{
1104 FAST_RETURN_IF_NO_FRONTENDS(false);
1105 if (auto* instrumentingAgents = instrumentingAgentsForContext(scriptExecutionContext))
1106 return instrumentingAgents->inspectorTimelineAgent();
1107 return false;
1108}
1109
1110void InspectorInstrumentation::didRequestAnimationFrameImpl(InstrumentingAgents& instrumentingAgents, int callbackId, Document& document)
1111{
1112 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
1113 pageDebuggerAgent->didRequestAnimationFrame(callbackId, document);
1114 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
1115 timelineAgent->didRequestAnimationFrame(callbackId, document.frame());
1116}
1117
1118void InspectorInstrumentation::didCancelAnimationFrameImpl(InstrumentingAgents& instrumentingAgents, int callbackId, Document& document)
1119{
1120 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
1121 pageDebuggerAgent->didCancelAnimationFrame(callbackId);
1122 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent())
1123 timelineAgent->didCancelAnimationFrame(callbackId, document.frame());
1124}
1125
1126InspectorInstrumentationCookie InspectorInstrumentation::willFireAnimationFrameImpl(InstrumentingAgents& instrumentingAgents, int callbackId, Document& document)
1127{
1128 if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
1129 pageDebuggerAgent->willFireAnimationFrame(callbackId);
1130
1131 if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
1132 domDebuggerAgent->willFireAnimationFrame();
1133
1134 int timelineAgentId = 0;
1135 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent()) {
1136 timelineAgent->willFireAnimationFrame(callbackId, document.frame());
1137 timelineAgentId = timelineAgent->id();
1138 }
1139 return InspectorInstrumentationCookie(instrumentingAgents, timelineAgentId);
1140}
1141
1142void InspectorInstrumentation::didFireAnimationFrameImpl(const InspectorInstrumentationCookie& cookie)
1143{
1144 if (InspectorDebuggerAgent* debuggerAgent = cookie.instrumentingAgents()->inspectorDebuggerAgent())
1145 debuggerAgent->didDispatchAsyncCall();
1146 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie))
1147 timelineAgent->didFireAnimationFrame();
1148}
1149
1150InspectorInstrumentationCookie InspectorInstrumentation::willFireObserverCallbackImpl(InstrumentingAgents& instrumentingAgents, const String& callbackType, ScriptExecutionContext& context)
1151{
1152 int timelineAgentId = 0;
1153 if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.inspectorTimelineAgent()) {
1154 timelineAgent->willFireObserverCallback(callbackType, frameForScriptExecutionContext(&context));
1155 timelineAgentId = timelineAgent->id();
1156 }
1157 return InspectorInstrumentationCookie(instrumentingAgents, timelineAgentId);
1158}
1159
1160void InspectorInstrumentation::didFireObserverCallbackImpl(const InspectorInstrumentationCookie& cookie)
1161{
1162 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie))
1163 timelineAgent->didFireObserverCallback();
1164}
1165
1166void InspectorInstrumentation::registerInstrumentingAgents(InstrumentingAgents& instrumentingAgents)
1167{
1168 if (!s_instrumentingAgentsSet)
1169 s_instrumentingAgentsSet = new HashSet<InstrumentingAgents*>();
1170
1171 s_instrumentingAgentsSet->add(&instrumentingAgents);
1172}
1173
1174void InspectorInstrumentation::unregisterInstrumentingAgents(InstrumentingAgents& instrumentingAgents)
1175{
1176 if (!s_instrumentingAgentsSet)
1177 return;
1178
1179 s_instrumentingAgentsSet->remove(&instrumentingAgents);
1180 if (s_instrumentingAgentsSet->isEmpty()) {
1181 delete s_instrumentingAgentsSet;
1182 s_instrumentingAgentsSet = nullptr;
1183 }
1184}
1185
1186InspectorTimelineAgent* InspectorInstrumentation::retrieveTimelineAgent(const InspectorInstrumentationCookie& cookie)
1187{
1188 if (!cookie.isValid())
1189 return nullptr;
1190
1191 InspectorTimelineAgent* timelineAgent = cookie.instrumentingAgents()->inspectorTimelineAgent();
1192 if (timelineAgent && cookie.hasMatchingTimelineAgentId(timelineAgent->id()))
1193 return timelineAgent;
1194 return nullptr;
1195}
1196
1197InstrumentingAgents* InspectorInstrumentation::instrumentingAgentsForRenderer(RenderObject& renderer)
1198{
1199 return instrumentingAgentsForFrame(renderer.frame());
1200}
1201
1202void InspectorInstrumentation::layerTreeDidChangeImpl(InstrumentingAgents& instrumentingAgents)
1203{
1204 if (InspectorLayerTreeAgent* layerTreeAgent = instrumentingAgents.inspectorLayerTreeAgent())
1205 layerTreeAgent->layerTreeDidChange();
1206}
1207
1208void InspectorInstrumentation::renderLayerDestroyedImpl(InstrumentingAgents& instrumentingAgents, const RenderLayer& renderLayer)
1209{
1210 if (InspectorLayerTreeAgent* layerTreeAgent = instrumentingAgents.inspectorLayerTreeAgent())
1211 layerTreeAgent->renderLayerDestroyed(renderLayer);
1212}
1213
1214} // namespace WebCore
1215