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