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