| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "sky/engine/config.h" | |
| 6 #include "sky/engine/core/inspector/InspectorTraceEvents.h" | |
| 7 | |
| 8 #include "sky/engine/bindings/core/v8/ScriptCallStackFactory.h" | |
| 9 #include "sky/engine/bindings/core/v8/ScriptGCEvent.h" | |
| 10 #include "sky/engine/bindings/core/v8/ScriptSourceCode.h" | |
| 11 #include "sky/engine/core/events/Event.h" | |
| 12 #include "sky/engine/core/frame/FrameView.h" | |
| 13 #include "sky/engine/core/frame/LocalDOMWindow.h" | |
| 14 #include "sky/engine/core/inspector/IdentifiersFactory.h" | |
| 15 #include "sky/engine/core/inspector/InspectorNodeIds.h" | |
| 16 #include "sky/engine/core/inspector/ScriptCallStack.h" | |
| 17 #include "sky/engine/core/page/Page.h" | |
| 18 #include "sky/engine/core/rendering/RenderImage.h" | |
| 19 #include "sky/engine/core/rendering/RenderObject.h" | |
| 20 #include "sky/engine/platform/JSONValues.h" | |
| 21 #include "sky/engine/platform/network/ResourceRequest.h" | |
| 22 #include "sky/engine/platform/network/ResourceResponse.h" | |
| 23 #include "sky/engine/platform/TracedValue.h" | |
| 24 #include "sky/engine/platform/weborigin/KURL.h" | |
| 25 #include "sky/engine/wtf/Vector.h" | |
| 26 | |
| 27 namespace blink { | |
| 28 | |
| 29 namespace { | |
| 30 | |
| 31 class JSCallStack : public TraceEvent::ConvertableToTraceFormat { | |
| 32 public: | |
| 33 explicit JSCallStack(PassRefPtr<ScriptCallStack> callstack) | |
| 34 { | |
| 35 ASSERT(m_serialized.isSafeToSendToAnotherThread()); | |
| 36 } | |
| 37 virtual String asTraceFormat() const | |
| 38 { | |
| 39 return m_serialized; | |
| 40 } | |
| 41 | |
| 42 private: | |
| 43 String m_serialized; | |
| 44 }; | |
| 45 | |
| 46 } | |
| 47 | |
| 48 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorLayoutEvent::beginData
(FrameView* frameView) | |
| 49 { | |
| 50 bool isPartial; | |
| 51 unsigned needsLayoutObjects; | |
| 52 unsigned totalObjects; | |
| 53 frameView->countObjectsNeedingLayout(needsLayoutObjects, totalObjects, isPar
tial); | |
| 54 | |
| 55 RefPtr<TracedValue> value = TracedValue::create(); | |
| 56 value->setInteger("dirtyObjects", needsLayoutObjects); | |
| 57 value->setInteger("totalObjects", totalObjects); | |
| 58 value->setBoolean("partialLayout", isPartial); | |
| 59 return value; | |
| 60 } | |
| 61 | |
| 62 static void createQuad(TracedValue* value, const char* name, const FloatQuad& qu
ad) | |
| 63 { | |
| 64 value->beginArray(name); | |
| 65 value->pushDouble(quad.p1().x()); | |
| 66 value->pushDouble(quad.p1().y()); | |
| 67 value->pushDouble(quad.p2().x()); | |
| 68 value->pushDouble(quad.p2().y()); | |
| 69 value->pushDouble(quad.p3().x()); | |
| 70 value->pushDouble(quad.p3().y()); | |
| 71 value->pushDouble(quad.p4().x()); | |
| 72 value->pushDouble(quad.p4().y()); | |
| 73 value->endArray(); | |
| 74 } | |
| 75 | |
| 76 static void setGeneratingNodeId(TracedValue* value, const char* fieldName, const
RenderObject* renderer) | |
| 77 { | |
| 78 Node* node = 0; | |
| 79 for (; renderer && !node; renderer = renderer->parent()) | |
| 80 node = renderer->node(); | |
| 81 if (!node) | |
| 82 return; | |
| 83 value->setInteger(fieldName, InspectorNodeIds::idForNode(node)); | |
| 84 } | |
| 85 | |
| 86 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorLayoutEvent::endData(R
enderObject* rootForThisLayout) | |
| 87 { | |
| 88 Vector<FloatQuad> quads; | |
| 89 rootForThisLayout->absoluteQuads(quads); | |
| 90 | |
| 91 RefPtr<TracedValue> value = TracedValue::create(); | |
| 92 if (quads.size() >= 1) { | |
| 93 createQuad(value.get(), "root", quads[0]); | |
| 94 setGeneratingNodeId(value.get(), "rootNode", rootForThisLayout); | |
| 95 } else { | |
| 96 ASSERT_NOT_REACHED(); | |
| 97 } | |
| 98 return value; | |
| 99 } | |
| 100 | |
| 101 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorSendRequestEvent::data
(unsigned long identifier, const ResourceRequest& request) | |
| 102 { | |
| 103 String requestId = IdentifiersFactory::requestId(identifier); | |
| 104 | |
| 105 RefPtr<TracedValue> value = TracedValue::create(); | |
| 106 value->setString("requestId", requestId); | |
| 107 value->setString("url", request.url().string()); | |
| 108 value->setString("requestMethod", request.httpMethod()); | |
| 109 return value; | |
| 110 } | |
| 111 | |
| 112 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorReceiveResponseEvent::
data(unsigned long identifier, const ResourceResponse& response) | |
| 113 { | |
| 114 String requestId = IdentifiersFactory::requestId(identifier); | |
| 115 | |
| 116 RefPtr<TracedValue> value = TracedValue::create(); | |
| 117 value->setString("requestId", requestId); | |
| 118 value->setInteger("statusCode", response.httpStatusCode()); | |
| 119 value->setString("mimeType", response.mimeType().string().isolatedCopy()); | |
| 120 return value; | |
| 121 } | |
| 122 | |
| 123 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorReceiveDataEvent::data
(unsigned long identifier, int encodedDataLength) | |
| 124 { | |
| 125 String requestId = IdentifiersFactory::requestId(identifier); | |
| 126 | |
| 127 RefPtr<TracedValue> value = TracedValue::create(); | |
| 128 value->setString("requestId", requestId); | |
| 129 value->setInteger("encodedDataLength", encodedDataLength); | |
| 130 return value; | |
| 131 } | |
| 132 | |
| 133 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorResourceFinishEvent::d
ata(unsigned long identifier, double finishTime, bool didFail) | |
| 134 { | |
| 135 String requestId = IdentifiersFactory::requestId(identifier); | |
| 136 | |
| 137 RefPtr<TracedValue> value = TracedValue::create(); | |
| 138 value->setString("requestId", requestId); | |
| 139 value->setBoolean("didFail", didFail); | |
| 140 if (finishTime) | |
| 141 value->setDouble("networkTime", finishTime); | |
| 142 return value; | |
| 143 } | |
| 144 | |
| 145 static PassRefPtr<TracedValue> genericTimerData(ExecutionContext* context, int t
imerId) | |
| 146 { | |
| 147 RefPtr<TracedValue> value = TracedValue::create(); | |
| 148 value->setInteger("timerId", timerId); | |
| 149 return value.release(); | |
| 150 } | |
| 151 | |
| 152 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorTimerInstallEvent::dat
a(ExecutionContext* context, int timerId, int timeout, bool singleShot) | |
| 153 { | |
| 154 RefPtr<TracedValue> value = genericTimerData(context, timerId); | |
| 155 value->setInteger("timeout", timeout); | |
| 156 value->setBoolean("singleShot", singleShot); | |
| 157 return value; | |
| 158 } | |
| 159 | |
| 160 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorTimerRemoveEvent::data
(ExecutionContext* context, int timerId) | |
| 161 { | |
| 162 return genericTimerData(context, timerId); | |
| 163 } | |
| 164 | |
| 165 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorTimerFireEvent::data(E
xecutionContext* context, int timerId) | |
| 166 { | |
| 167 return genericTimerData(context, timerId); | |
| 168 } | |
| 169 | |
| 170 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorAnimationFrameEvent::d
ata(Document* document, int callbackId) | |
| 171 { | |
| 172 RefPtr<TracedValue> value = TracedValue::create(); | |
| 173 value->setInteger("id", callbackId); | |
| 174 return value; | |
| 175 } | |
| 176 | |
| 177 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorParseHtmlEvent::beginD
ata(Document* document, unsigned startLine) | |
| 178 { | |
| 179 RefPtr<TracedValue> value = TracedValue::create(); | |
| 180 value->setInteger("startLine", startLine); | |
| 181 return value; | |
| 182 } | |
| 183 | |
| 184 static void localToPageQuad(const RenderObject& renderer, const LayoutRect& rect
, FloatQuad* quad) | |
| 185 { | |
| 186 FloatQuad absolute = renderer.localToAbsoluteQuad(FloatQuad(rect)); | |
| 187 quad->setP1(roundedIntPoint(absolute.p1())); | |
| 188 quad->setP2(roundedIntPoint(absolute.p2())); | |
| 189 quad->setP3(roundedIntPoint(absolute.p3())); | |
| 190 quad->setP4(roundedIntPoint(absolute.p4())); | |
| 191 } | |
| 192 | |
| 193 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorPaintEvent::data(Rende
rObject* renderer, const LayoutRect& clipRect) | |
| 194 { | |
| 195 RefPtr<TracedValue> value = TracedValue::create(); | |
| 196 FloatQuad quad; | |
| 197 localToPageQuad(*renderer, clipRect, &quad); | |
| 198 createQuad(value.get(), "clip", quad); | |
| 199 setGeneratingNodeId(value.get(), "nodeId", renderer); | |
| 200 value->setInteger("layerId", 0); | |
| 201 return value; | |
| 202 } | |
| 203 | |
| 204 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorMarkLoadEvent::data() | |
| 205 { | |
| 206 return TracedValue::create(); | |
| 207 } | |
| 208 | |
| 209 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorEvaluateScriptEvent::d
ata(const String& url, int lineNumber) | |
| 210 { | |
| 211 RefPtr<TracedValue> value = TracedValue::create(); | |
| 212 value->setString("url", url); | |
| 213 value->setInteger("lineNumber", lineNumber); | |
| 214 return value; | |
| 215 } | |
| 216 | |
| 217 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorFunctionCallEvent::dat
a(ExecutionContext* context, int scriptId, const String& scriptName, int scriptL
ine) | |
| 218 { | |
| 219 RefPtr<TracedValue> value = TracedValue::create(); | |
| 220 value->setString("scriptId", String::number(scriptId)); | |
| 221 value->setString("scriptName", scriptName); | |
| 222 value->setInteger("scriptLine", scriptLine); | |
| 223 return value; | |
| 224 } | |
| 225 | |
| 226 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorPaintImageEvent::data(
const RenderImage& renderImage) | |
| 227 { | |
| 228 RefPtr<TracedValue> value = TracedValue::create(); | |
| 229 setGeneratingNodeId(value.get(), "nodeId", &renderImage); | |
| 230 if (const ImageResource* resource = renderImage.cachedImage()) | |
| 231 value->setString("url", resource->url().string()); | |
| 232 return value; | |
| 233 } | |
| 234 | |
| 235 static size_t usedHeapSize() | |
| 236 { | |
| 237 HeapInfo info; | |
| 238 ScriptGCEvent::getHeapSize(info); | |
| 239 return info.usedJSHeapSize; | |
| 240 } | |
| 241 | |
| 242 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorUpdateCountersEvent::d
ata() | |
| 243 { | |
| 244 RefPtr<TracedValue> value = TracedValue::create(); | |
| 245 if (isMainThread()) { | |
| 246 value->setInteger("documents", InspectorCounters::counterValue(Inspector
Counters::DocumentCounter)); | |
| 247 value->setInteger("nodes", InspectorCounters::counterValue(InspectorCoun
ters::NodeCounter)); | |
| 248 value->setInteger("jsEventListeners", InspectorCounters::counterValue(In
spectorCounters::JSEventListenerCounter)); | |
| 249 } | |
| 250 value->setDouble("jsHeapSizeUsed", static_cast<double>(usedHeapSize())); | |
| 251 return value; | |
| 252 } | |
| 253 | |
| 254 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorCallStackEvent::curren
tCallStack() | |
| 255 { | |
| 256 return adoptRef(new JSCallStack(createScriptCallStack(ScriptCallStack::maxCa
llStackSizeToCapture, true))); | |
| 257 } | |
| 258 | |
| 259 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorEventDispatchEvent::da
ta(const Event& event) | |
| 260 { | |
| 261 RefPtr<TracedValue> value = TracedValue::create(); | |
| 262 value->setString("type", event.type()); | |
| 263 return value; | |
| 264 } | |
| 265 | |
| 266 PassRefPtr<TraceEvent::ConvertableToTraceFormat> InspectorTimeStampEvent::data(E
xecutionContext* context, const String& message) | |
| 267 { | |
| 268 RefPtr<TracedValue> value = TracedValue::create(); | |
| 269 value->setString("message", message); | |
| 270 return value; | |
| 271 } | |
| 272 | |
| 273 } | |
| OLD | NEW |