1/*
2* Copyright (C) 2013 Google Inc. All rights reserved.
3*
4* Redistribution and use in source and binary forms, with or without
5* modification, are permitted provided that the following conditions are
6* met:
7*
8*     * Redistributions of source code must retain the above copyright
9* notice, this list of conditions and the following disclaimer.
10*     * Redistributions in binary form must reproduce the above
11* copyright notice, this list of conditions and the following disclaimer
12* in the documentation and/or other materials provided with the
13* distribution.
14*     * Neither the name of Google Inc. nor the names of its
15* contributors may be used to endorse or promote products derived from
16* this software without specific prior written permission.
17*
18* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*/
30
31/*
32* CodeGeneratorInstrumentation.py uses this file as a source to generate
33* InspectorInstrumentationInl.h and InspectorInstrumentationImpl.cpp
34*
35* The code below is not a correct IDL but a mix of IDL and C++.
36*
37* The syntax for an instrumentation method is as follows:
38*
39*    [methodAttributes] returnValue methodName([paramAttr1] param1, [paramAttr2] param2, ...)
40*
41* Where:
42*   methodAttributes - optional list of method attributes.
43*       Attributes containing "=" are code generation options:
44*           Inline=Custom - do not generate the public inline method.
45*           Inline=FastReturn - return early from the inline method if there are no frontends.
46*           Inline=Forward - generate a simple forwarding inline method that does not
47                             modify the parameter list (implies Inline=FastReturn)
48*       Attributes without "=" are the names of the agents to be invoked.
49*           Examples: DOM, Page, Debugger.
50*
51*   paramAttr - optional attribute controlling the parameters handling (one attribute per parameter max).
52*       Keep - pass first parameter (used to access the InstrumentingAgents instance) to agents.
53*       FastReturn - return early from the inline method if this parameter is 0/false.
54*
55*   returnValue: C++ return value. Only "void" and "InspectorInstrumentationCookie" are supported.
56*
57*   methodName: C++ name for the public instrumentation method and agents methods.
58*
59*   paramList: C++ parameter list with optional names. Names will be deduced from types if omitted but you have to
60*        specify explicit names for multiple parameters of the same type.
61*/
62
63interface InspectorInstrumentation {
64    [Page, Inspector, PageDebugger, PageRuntime]
65    void didClearWindowObjectInWorld([Keep] Frame*, DOMWrapperWorld*);
66
67    [DOMDebugger, Inline=FastReturn]
68    void willInsertDOMNode(Document*, Node* parent);
69
70    [DOM, DOMDebugger, Inline=FastReturn]
71    void didInsertDOMNode(Document*, Node*);
72
73    [DOMDebugger, DOM, Inline=FastReturn]
74    void willRemoveDOMNode(Document* document, Node*);
75
76    [DOMDebugger, DOM, Inline=FastReturn]
77    void willModifyDOMAttr(Document*, Element*, const AtomicString& oldValue, const AtomicString& newValue);
78
79    [DOM, Inline=FastReturn]
80    void didModifyDOMAttr(Document*, Element*, const AtomicString& name, const AtomicString& value);
81
82    [DOM, Inline=FastReturn]
83    void didRemoveDOMAttr(Document*, Element*, const AtomicString& name);
84
85    [DOM, Inline=FastReturn]
86    void characterDataModified(Document*, CharacterData*);
87
88    [DOM, DOMDebugger, Inline=FastReturn]
89    void didInvalidateStyleAttr(Document*, Node*);
90
91    [CSS, Inline=FastReturn]
92    void activeStyleSheetsUpdated([Keep] Document*, const Vector<RefPtr<StyleSheet> >& newSheets);
93
94    [Console]
95    void frameWindowDiscarded(Frame*, DOMWindow* domWindow);
96
97    [CSS, Inline=FastReturn]
98    void mediaQueryResultChanged(Document*);
99
100    [DOM, Inline=FastReturn]
101    void didPushShadowRoot([Keep] Element* host, ShadowRoot*);
102
103    [DOM, Inline=FastReturn]
104    void willPopShadowRoot([Keep] Element* host, ShadowRoot*);
105
106    [CSS, Inline=FastReturn]
107    void didCreateNamedFlow([Keep] Document*, NamedFlow*);
108
109    [CSS, Inline=FastReturn]
110    void willRemoveNamedFlow([Keep] Document*, NamedFlow*);
111
112    [CSS, Inline=FastReturn]
113    void didUpdateRegionLayout([Keep] Document*, NamedFlow*);
114
115    [CSS, Inline=FastReturn]
116    void didChangeRegionOverset([Keep] Document*, NamedFlow*);
117
118    [DOMDebugger, Inline=FastReturn]
119    void willSendXMLHttpRequest(ScriptExecutionContext*, const String& url);
120
121    [DOMDebugger, Inline=FastReturn]
122    void didFireWebGLError(Element*, const String& errorName);
123
124    [DOMDebugger, Inline=FastReturn]
125    void didFireWebGLWarning(Element*);
126
127    [DOMDebugger, Inline=FastReturn]
128    void didFireWebGLErrorOrWarning(Element*, const String& message);
129
130    [Timeline, Inline=FastReturn]
131    void didScheduleResourceRequest([Keep] Document*, const String& url);
132
133    [DOMDebugger, Timeline, Inline=FastReturn]
134    void didInstallTimer([Keep] ScriptExecutionContext*, int timerId, int timeout, bool singleShot);
135
136    [DOMDebugger, Timeline, Inline=FastReturn]
137    void didRemoveTimer([Keep] ScriptExecutionContext*, int timerId);
138
139    [Timeline, Inline=FastReturn]
140    InspectorInstrumentationCookie willCallFunction([Keep] ScriptExecutionContext*, const String& scriptName, int scriptLine);
141
142    [Timeline, Inline=FastReturn]
143    void didCallFunction(const InspectorInstrumentationCookie&);
144
145    [Timeline, Inline=FastReturn]
146    InspectorInstrumentationCookie willDispatchXHRReadyStateChangeEvent([Keep] ScriptExecutionContext*, XMLHttpRequest*);
147
148    [Timeline, Inline=FastReturn]
149    void didDispatchXHRReadyStateChangeEvent(const InspectorInstrumentationCookie&);
150
151    [Timeline, Inline=FastReturn]
152    InspectorInstrumentationCookie willDispatchEvent([Keep] Document*, const Event&, DOMWindow*, Node*, const EventPath&);
153
154    [Timeline, Inline=FastReturn]
155    void didDispatchEvent(const InspectorInstrumentationCookie&);
156
157    [DOMDebugger, Inline=FastReturn]
158    InspectorInstrumentationCookie willHandleEvent(ScriptExecutionContext*, Event*);
159
160    [Debugger, Inline=FastReturn]
161    void didHandleEvent(const InspectorInstrumentationCookie&);
162
163    [Timeline, Inline=FastReturn]
164    InspectorInstrumentationCookie willDispatchEventOnWindow(Frame*, const Event&, DOMWindow*);
165
166    [Timeline, Inline=FastReturn]
167    void didDispatchEventOnWindow(const InspectorInstrumentationCookie&);
168
169    [Timeline, Inline=FastReturn]
170    InspectorInstrumentationCookie willEvaluateScript([Keep] Frame*, const String& url, int lineNumber);
171
172    [Timeline, Inline=FastReturn]
173    void didEvaluateScript(const InspectorInstrumentationCookie&);
174
175    [Page, Inline=FastReturn]
176    void scriptsEnabled(Page*, bool isEnabled);
177
178    [PageRuntime, Inline=FastReturn]
179    void didCreateIsolatedContext([Keep] Frame*, ScriptState*, SecurityOrigin*);
180
181    [DOMDebugger, Timeline, Inline=FastReturn]
182    InspectorInstrumentationCookie willFireTimer([Keep] ScriptExecutionContext*, int timerId);
183
184    [Debugger, Timeline, Inline=FastReturn]
185    void didFireTimer(const InspectorInstrumentationCookie&);
186
187    [Timeline, Inline=FastReturn]
188    void didInvalidateLayout([Keep] Frame*);
189
190    [Timeline, Inline=FastReturn]
191    InspectorInstrumentationCookie willLayout([Keep] Frame*);
192
193    [Timeline, Page, Inline=FastReturn]
194    void didLayout(const InspectorInstrumentationCookie&, RenderObject* root);
195
196    [Page, Inline=FastReturn]
197    void didScroll(Page*);
198
199    [Page, Inline=FastReturn]
200    void didResizeMainFrame(Page*);
201
202    [Timeline, Inline=FastReturn]
203    InspectorInstrumentationCookie willDispatchXHRLoadEvent([Keep] ScriptExecutionContext*, XMLHttpRequest*);
204
205    [Timeline, Inline=FastReturn]
206    void didDispatchXHRLoadEvent(const InspectorInstrumentationCookie&);
207
208    [Timeline, Inline=FastReturn]
209    void willScrollLayer([Keep] RenderObject*);
210
211    [Timeline, Inline=FastReturn]
212    void didScrollLayer(RenderObject*);
213
214    [Timeline, Inline=FastReturn]
215    void willPaint([Keep] RenderObject*);
216
217    [Timeline, Page, Inline=FastReturn]
218    void didPaint([Keep] RenderObject*, GraphicsContext*, const LayoutRect&);
219
220    [Resource, Timeline, Inline=FastReturn]
221    InspectorInstrumentationCookie willRecalculateStyle([Keep] Document*);
222
223    [Timeline, Resource, Page, Inline=FastReturn]
224    void didRecalculateStyle(const InspectorInstrumentationCookie&);
225
226    [Timeline, Inline=FastReturn]
227    void didRecalculateStyleForElement(Element*);
228
229    [Timeline, Resource, Inline=FastReturn]
230    void didScheduleStyleRecalculation([Keep] Document*);
231
232    [Resource, Inline=FastReturn]
233    void applyUserAgentOverride(Frame*, String* userAgent);
234
235    [Page, Inline=FastReturn]
236    void applyScreenWidthOverride(Frame*, long* width);
237
238    [Page, Inline=FastReturn]
239    void applyScreenHeightOverride(Frame*, long* height);
240
241    [Page, Inline=FastReturn]
242    void applyEmulatedMedia(Frame*, String* media);
243
244    [Timeline, Resource]
245    void willSendRequest(Frame*, unsigned long identifier, DocumentLoader*, ResourceRequest&, const ResourceResponse& redirectResponse, const FetchInitiatorInfo&);
246
247    void continueAfterPingLoader(Frame*, unsigned long identifier, DocumentLoader*, ResourceRequest&, const ResourceResponse&);
248
249    [Resource]
250    void markResourceAsCached(Page*, unsigned long identifier);
251
252    [Timeline, Inline=FastReturn]
253    InspectorInstrumentationCookie willReceiveResourceData([Keep] Frame*, unsigned long identifier, int length);
254
255    [Timeline, Inline=FastReturn]
256    void didReceiveResourceData(const InspectorInstrumentationCookie&);
257
258    [Timeline]
259    InspectorInstrumentationCookie willReceiveResourceResponse([Keep] Frame*, unsigned long identifier, const ResourceResponse&);
260
261    [Timeline, Resource, Console] // Console should come AFTER Resource notification, front-end relies on this.
262    void didReceiveResourceResponse(const InspectorInstrumentationCookie&, unsigned long identifier, DocumentLoader*, const ResourceResponse&, ResourceLoader*);
263
264    [Inline=Forward]
265    void continueAfterXFrameOptionsDenied(Frame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r);
266
267    [Inline=Forward]
268    void continueWithPolicyDownload(Frame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r);
269
270    [Inline=Forward]
271    void continueWithPolicyIgnore(Frame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r);
272
273    [Resource]
274    void didReceiveData(Frame*, unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
275
276    [Timeline, Resource]
277    void didFinishLoading(Frame* frame, unsigned long identifier, DocumentLoader*, double finishTime);
278
279    [Timeline, Resource, Console] // Console should come AFTER Resource notification, front-end relies on this.
280    void didFailLoading(Frame* frame, unsigned long identifier, DocumentLoader*, const ResourceError&);
281
282    [Resource]
283    void documentThreadableLoaderStartedLoadingForClient(ScriptExecutionContext*, unsigned long identifier, ThreadableLoaderClient* client);
284
285    [Resource]
286    void willLoadXHR(ScriptExecutionContext*, ThreadableLoaderClient* client, const String& method, const KURL& url, bool async, PassRefPtr<FormData>, const HTTPHeaderMap& headers, bool includeCredentials);
287
288    [Resource]
289    void didFailXHRLoading(ScriptExecutionContext*, ThreadableLoaderClient* client);
290
291    [Console, Resource]
292    void didFinishXHRLoading(ScriptExecutionContext*, ThreadableLoaderClient* client, unsigned long identifier, ScriptString sourceString, const String& url, const String& sendURL, unsigned sendLineNumber);
293
294    [Resource]
295    void didReceiveXHRResponse(ScriptExecutionContext*, unsigned long identifier);
296
297    [Resource]
298    void willLoadXHRSynchronously(ScriptExecutionContext*);
299
300    [Resource]
301    void didLoadXHRSynchronously(ScriptExecutionContext*);
302
303    [Resource]
304    void scriptImported(ScriptExecutionContext*, unsigned long identifier, const String& sourceString);
305
306    [Debugger]
307    void scriptExecutionBlockedByCSP(ScriptExecutionContext*, const String& directiveText);
308
309    [Resource]
310    void didReceiveScriptResponse(ScriptExecutionContext*, unsigned long identifier);
311
312    [Timeline, Inspector, DOM, Page]
313    void domContentLoadedEventFired([Keep] Frame*);
314
315    [DOM, Timeline, Page]
316    void loadEventFired([Keep] Frame*);
317
318    [Canvas, Page, CSS]
319    void frameDetachedFromParent([Keep] Frame*);
320
321    [Page, Inline=FastReturn]
322    void childDocumentOpened([Keep] Document*);
323
324    [Console, Resource, CSS, Database, DOM, LayerTree, Inspector, Canvas, Page]
325    void didCommitLoad([Keep] Frame*, DocumentLoader*);
326
327    [DOM, Inline=FastReturn]
328    void frameDocumentUpdated([Keep] Frame*);
329
330    [Page]
331    void loaderDetachedFromFrame(Frame*, DocumentLoader*);
332
333    [Page]
334    void frameStartedLoading([Keep] Frame*);
335
336    [Page]
337    void frameStoppedLoading([Keep] Frame*);
338
339    [Page]
340    void frameScheduledNavigation([Keep] Frame*, double delay);
341
342    [Page]
343    void frameClearedScheduledNavigation([Keep] Frame*);
344
345    [Page, Inline=FastReturn]
346    InspectorInstrumentationCookie willRunJavaScriptDialog(Page*, const String& message);
347
348    [Page, Inline=FastReturn]
349    void didRunJavaScriptDialog(const InspectorInstrumentationCookie&);
350
351    [Inline=Forward]
352    void willDestroyResource(Resource* cachedResource);
353
354    [Timeline, Inline=FastReturn]
355    InspectorInstrumentationCookie willWriteHTML([Keep] Document*, unsigned startLine);
356
357    [Timeline, Inline=FastReturn]
358    void didWriteHTML(const InspectorInstrumentationCookie&, unsigned endLine);
359
360    [DOMDebugger, Timeline]
361    void didRequestAnimationFrame([Keep] Document*, int callbackId);
362
363    [DOMDebugger, Timeline]
364    void didCancelAnimationFrame([Keep] Document*, int callbackId);
365
366    [DOMDebugger, Timeline]
367    InspectorInstrumentationCookie willFireAnimationFrame([Keep] Document*, int callbackId);
368
369    [Timeline, Inline=FastReturn]
370    void didFireAnimationFrame(const InspectorInstrumentationCookie&);
371
372    [DOMStorage, Inline=FastReturn]
373    void didDispatchDOMStorageEvent(Page* page, const String& key, const String& oldValue, const String& newValue, StorageType storageType, SecurityOrigin* securityOrigin);
374
375    [Worker]
376    void didStartWorkerGlobalScope(ScriptExecutionContext*, WorkerGlobalScopeProxy* proxy, const KURL& url);
377
378    [WorkerRuntime]
379    void willEvaluateWorkerScript([Keep] WorkerGlobalScope* context, int workerThreadStartMode);
380
381    [Worker]
382    void workerGlobalScopeTerminated(ScriptExecutionContext*, WorkerGlobalScopeProxy* proxy);
383
384    [Resource, Timeline]
385    void didCreateWebSocket([Keep] Document*, unsigned long identifier, const KURL& requestURL, const String& protocol);
386
387    [Resource, Timeline]
388    void willSendWebSocketHandshakeRequest([Keep] Document*, unsigned long identifier, const WebSocketHandshakeRequest& request);
389
390    [Resource, Timeline]
391    void didReceiveWebSocketHandshakeResponse([Keep] Document*, unsigned long identifier, const WebSocketHandshakeResponse& response);
392
393    [Resource, Timeline]
394    void didCloseWebSocket([Keep] Document*, unsigned long identifier);
395
396    [Resource]
397    void didReceiveWebSocketFrame(Document*, unsigned long identifier, const WebSocketFrame& frame);
398
399    [Resource]
400    void didSendWebSocketFrame(Document*, unsigned long identifier, const WebSocketFrame& frame);
401
402    [Resource]
403    void didReceiveWebSocketFrameError(Document*, unsigned long identifier, const String& errorMessage);
404
405    [ApplicationCache, Inline=FastReturn]
406    void networkStateChanged(Page*);
407
408    [ApplicationCache, Inline=FastReturn]
409    void updateApplicationCacheStatus([Keep] Frame*);
410
411    [LayerTree]
412    void layerTreeDidChange(Page*);
413}
414
415interface InspectorConsoleInstrumentation {
416
417#include "core/inspector/ScriptArguments.h"
418#include "core/inspector/ScriptCallStack.h"
419#include "core/inspector/ScriptProfile.h"
420
421    [Console, Debugger]  // FIXME: Drop this once we no longer generate stacks outside of Inspector.
422    void addMessageToConsole(Page* page, MessageSource source, MessageType type, MessageLevel level, const String& message, PassRefPtr<ScriptCallStack> callStack, unsigned long requestIdentifier = 0);
423
424    [Console, Debugger]
425    void addMessageToConsole(Page* page, MessageSource source, MessageType type, MessageLevel level, const String& message, ScriptState* state, PassRefPtr<ScriptArguments> arguments, unsigned long requestIdentifier = 0);
426
427    [Console]
428    void addMessageToConsole(Page* page, MessageSource source, MessageType type, MessageLevel level, const String& message, const String& scriptId, unsigned lineNumber, unsigned columnNumber = 0, ScriptState* state = 0, unsigned long requestIdentifier = 0);
429
430    // FIXME: Convert to ScriptArguments to match non-worker context.
431    // Use the same implementation as above as a similar method dispatched on Page.
432    void addMessageToConsole(WorkerGlobalScope* workerGlobalScope, MessageSource source, MessageType type, MessageLevel level, const String& message, PassRefPtr<ScriptCallStack> callStack, unsigned long requestIdentifier = 0);
433
434    // Use the same implementation as above as a similar method dispatched on Page.
435    void addMessageToConsole(WorkerGlobalScope* workerGlobalScope, MessageSource source, MessageType type, MessageLevel level, const String& message, const String& scriptId, unsigned lineNumber, unsigned columnNumber, ScriptState* state, unsigned long requestIdentifier = 0);
436
437    [Console]
438    void consoleCount(Page* page, ScriptState* state, PassRefPtr<ScriptArguments> arguments);
439
440    [Timeline, Console]
441    void startConsoleTiming([Keep] Frame* frame, const String& title);
442
443    [Console, Timeline]
444    void stopConsoleTiming([Keep] Frame* frame, const String& title, PassRefPtr<ScriptCallStack> stack);
445
446    [Timeline, Inline=FastReturn]
447    void consoleTimeStamp([Keep] Frame* frame, PassRefPtr<ScriptArguments> arguments);
448
449    [Profiler]
450    void addStartProfilingMessageToConsole(Page* page, const String& title, unsigned lineNumber, const String& sourceURL);
451
452    [Profiler]
453    void addProfile(Page* page, PassRefPtr<ScriptProfile> profile, PassRefPtr<ScriptCallStack> callStack);
454}
455
456interface InspectorDatabaseInstrumentation {
457
458#include "modules/webdatabase/Database.h"
459
460    [Database]
461    void didOpenDatabase(ScriptExecutionContext* context, PassRefPtr<Database> database, const String& domain, const String& name, const String& version);
462}
463
464interface InspectorOverrides {
465    [CSS, Inline=FastReturn]
466    bool forcePseudoState([Keep] Element* element, CSSSelector::PseudoType pseudoState);
467
468    [Page, Inline=FastReturn]
469    bool shouldApplyScreenWidthOverride(Frame* frame);
470
471    [Page, Inline=FastReturn]
472    bool shouldApplyScreenHeightOverride(Frame* frame);
473
474    [Worker, Inline=FastReturn]
475    bool shouldPauseDedicatedWorkerOnStart(ScriptExecutionContext* context);
476
477    [Page, Inline=FastReturn]
478    GeolocationPosition* overrideGeolocationPosition(Page* page, [DefaultReturn] GeolocationPosition* position);
479
480    [Page, Inline=FastReturn]
481    DeviceOrientationData* overrideDeviceOrientation(Page* page, [DefaultReturn] DeviceOrientationData* deviceOrientation);
482
483    [Profiler]
484    String getCurrentUserInitiatedProfileName(Page* page, bool incrementProfileNumber);
485}
486
487
488interface InspectorCanvasInstrumentation {
489
490#include "bindings/v8/ScriptObject.h"
491
492    [Canvas]
493    ScriptObject wrapCanvas2DRenderingContextForInstrumentation(Document*, const ScriptObject&);
494
495    [Canvas]
496    ScriptObject wrapWebGLRenderingContextForInstrumentation(Document*, const ScriptObject&);
497}
498