1/*
2 * Copyright (C) 2009 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#include "config.h"
32
33#if ENABLE(INSPECTOR)
34
35#include "TimelineRecordFactory.h"
36
37#include "Event.h"
38#include "FloatQuad.h"
39#include "InspectorValues.h"
40#include "IntRect.h"
41#include "LayoutRect.h"
42#include "ResourceRequest.h"
43#include "ResourceResponse.h"
44#include "ScriptCallStack.h"
45#include "ScriptCallStackFactory.h"
46#include <wtf/CurrentTime.h>
47
48namespace WebCore {
49
50PassRefPtr<InspectorObject> TimelineRecordFactory::createGenericRecord(double startTime, int maxCallStackDepth)
51{
52    RefPtr<InspectorObject> record = InspectorObject::create();
53    record->setNumber("startTime", startTime);
54
55    if (maxCallStackDepth) {
56        RefPtr<ScriptCallStack> stackTrace = createScriptCallStack(maxCallStackDepth, true);
57        if (stackTrace && stackTrace->size())
58            record->setValue("stackTrace", stackTrace->buildInspectorArray());
59    }
60    return record.release();
61}
62
63PassRefPtr<InspectorObject> TimelineRecordFactory::createBackgroundRecord(double startTime, const String& threadName)
64{
65    RefPtr<InspectorObject> record = InspectorObject::create();
66    record->setNumber("startTime", startTime);
67    record->setString("thread", threadName);
68    return record.release();
69}
70
71PassRefPtr<InspectorObject> TimelineRecordFactory::createGCEventData(const size_t usedHeapSizeDelta)
72{
73    RefPtr<InspectorObject> data = InspectorObject::create();
74    data->setNumber("usedHeapSizeDelta", usedHeapSizeDelta);
75    return data.release();
76}
77
78PassRefPtr<InspectorObject> TimelineRecordFactory::createFunctionCallData(const String& scriptName, int scriptLine)
79{
80    RefPtr<InspectorObject> data = InspectorObject::create();
81    data->setString("scriptName", scriptName);
82    data->setNumber("scriptLine", scriptLine);
83    return data.release();
84}
85
86PassRefPtr<InspectorObject> TimelineRecordFactory::createEventDispatchData(const Event& event)
87{
88    RefPtr<InspectorObject> data = InspectorObject::create();
89    data->setString("type", event.type().string());
90    return data.release();
91}
92
93PassRefPtr<InspectorObject> TimelineRecordFactory::createGenericTimerData(int timerId)
94{
95    RefPtr<InspectorObject> data = InspectorObject::create();
96    data->setNumber("timerId", timerId);
97    return data.release();
98}
99
100PassRefPtr<InspectorObject> TimelineRecordFactory::createTimerInstallData(int timerId, int timeout, bool singleShot)
101{
102    RefPtr<InspectorObject> data = InspectorObject::create();
103    data->setNumber("timerId", timerId);
104    data->setNumber("timeout", timeout);
105    data->setBoolean("singleShot", singleShot);
106    return data.release();
107}
108
109PassRefPtr<InspectorObject> TimelineRecordFactory::createXHRReadyStateChangeData(const String& url, int readyState)
110{
111    RefPtr<InspectorObject> data = InspectorObject::create();
112    data->setString("url", url);
113    data->setNumber("readyState", readyState);
114    return data.release();
115}
116
117PassRefPtr<InspectorObject> TimelineRecordFactory::createXHRLoadData(const String& url)
118{
119    RefPtr<InspectorObject> data = InspectorObject::create();
120    data->setString("url", url);
121    return data.release();
122}
123
124PassRefPtr<InspectorObject> TimelineRecordFactory::createEvaluateScriptData(const String& url, double lineNumber)
125{
126    RefPtr<InspectorObject> data = InspectorObject::create();
127    data->setString("url", url);
128    data->setNumber("lineNumber", lineNumber);
129    return data.release();
130}
131
132PassRefPtr<InspectorObject> TimelineRecordFactory::createTimeStampData(const String& message)
133{
134    RefPtr<InspectorObject> data = InspectorObject::create();
135    data->setString("message", message);
136    return data.release();
137}
138
139PassRefPtr<InspectorObject> TimelineRecordFactory::createScheduleResourceRequestData(const String& url)
140{
141    RefPtr<InspectorObject> data = InspectorObject::create();
142    data->setString("url", url);
143    return data.release();
144}
145
146PassRefPtr<InspectorObject> TimelineRecordFactory::createResourceSendRequestData(const String& requestId, const ResourceRequest& request)
147{
148    RefPtr<InspectorObject> data = InspectorObject::create();
149    data->setString("requestId", requestId);
150    data->setString("url", request.url().string());
151    data->setString("requestMethod", request.httpMethod());
152    return data.release();
153}
154
155PassRefPtr<InspectorObject> TimelineRecordFactory::createResourceReceiveResponseData(const String& requestId, const ResourceResponse& response)
156{
157    RefPtr<InspectorObject> data = InspectorObject::create();
158    data->setString("requestId", requestId);
159    data->setNumber("statusCode", response.httpStatusCode());
160    data->setString("mimeType", response.mimeType());
161    return data.release();
162}
163
164PassRefPtr<InspectorObject> TimelineRecordFactory::createResourceFinishData(const String& requestId, bool didFail, double finishTime)
165{
166    RefPtr<InspectorObject> data = InspectorObject::create();
167    data->setString("requestId", requestId);
168    data->setBoolean("didFail", didFail);
169    if (finishTime)
170        data->setNumber("networkTime", finishTime);
171    return data.release();
172}
173
174PassRefPtr<InspectorObject> TimelineRecordFactory::createReceiveResourceData(const String& requestId, int length)
175{
176    RefPtr<InspectorObject> data = InspectorObject::create();
177    data->setString("requestId", requestId);
178    data->setNumber("encodedDataLength", length);
179    return data.release();
180}
181
182PassRefPtr<InspectorObject> TimelineRecordFactory::createLayoutData(unsigned dirtyObjects, unsigned totalObjects, bool partialLayout)
183{
184    RefPtr<InspectorObject> data = InspectorObject::create();
185    data->setNumber("dirtyObjects", dirtyObjects);
186    data->setNumber("totalObjects", totalObjects);
187    data->setBoolean("partialLayout", partialLayout);
188    return data.release();
189}
190
191PassRefPtr<InspectorObject> TimelineRecordFactory::createDecodeImageData(const String& imageType)
192{
193    RefPtr<InspectorObject> data = InspectorObject::create();
194    data->setString("imageType", imageType);
195    return data.release();
196}
197
198PassRefPtr<InspectorObject> TimelineRecordFactory::createResizeImageData(bool shouldCache)
199{
200    RefPtr<InspectorObject> data = InspectorObject::create();
201    data->setBoolean("cached", shouldCache);
202    return data.release();
203}
204
205PassRefPtr<InspectorObject> TimelineRecordFactory::createMarkData(bool isMainFrame)
206{
207    RefPtr<InspectorObject> data = InspectorObject::create();
208    data->setBoolean("isMainFrame", isMainFrame);
209    return data.release();
210}
211
212PassRefPtr<InspectorObject> TimelineRecordFactory::createParseHTMLData(unsigned startLine)
213{
214    RefPtr<InspectorObject> data = InspectorObject::create();
215    data->setNumber("startLine", startLine);
216    return data.release();
217}
218
219PassRefPtr<InspectorObject> TimelineRecordFactory::createAnimationFrameData(int callbackId)
220{
221    RefPtr<InspectorObject> data = InspectorObject::create();
222    data->setNumber("id", callbackId);
223    return data.release();
224}
225
226static PassRefPtr<InspectorArray> createQuad(const FloatQuad& quad)
227{
228    RefPtr<InspectorArray> array = InspectorArray::create();
229    array->pushNumber(quad.p1().x());
230    array->pushNumber(quad.p1().y());
231    array->pushNumber(quad.p2().x());
232    array->pushNumber(quad.p2().y());
233    array->pushNumber(quad.p3().x());
234    array->pushNumber(quad.p3().y());
235    array->pushNumber(quad.p4().x());
236    array->pushNumber(quad.p4().y());
237    return array.release();
238}
239
240PassRefPtr<InspectorObject> TimelineRecordFactory::createPaintData(const FloatQuad& quad)
241{
242    RefPtr<InspectorObject> data = InspectorObject::create();
243    data->setArray("clip", createQuad(quad));
244    return data.release();
245}
246
247void TimelineRecordFactory::appendLayoutRoot(InspectorObject* data, const FloatQuad& quad)
248{
249    data->setArray("root", createQuad(quad));
250}
251
252} // namespace WebCore
253
254#endif // ENABLE(INSPECTOR)
255