Home | History | Annotate | Download | only in inspector
      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