/*
* Copyright (C) 2009 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
*     * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
*     * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef InspectorTimelineAgent_h
#define InspectorTimelineAgent_h

#if ENABLE(INSPECTOR)

#include "Document.h"
#include "ScriptExecutionContext.h"
#include "ScriptObject.h"
#include "ScriptArray.h"
#include <wtf/Vector.h>

namespace WebCore {
    class Event;
    class InspectorFrontend;
    class IntRect;
    class ResourceRequest;
    class ResourceResponse;

    // Must be kept in sync with TimelineAgent.js
    enum TimelineRecordType {
        EventDispatchTimelineRecordType = 0,
        LayoutTimelineRecordType = 1,
        RecalculateStylesTimelineRecordType = 2,
        PaintTimelineRecordType = 3,
        ParseHTMLTimelineRecordType = 4,
        TimerInstallTimelineRecordType = 5,
        TimerRemoveTimelineRecordType = 6,
        TimerFireTimelineRecordType = 7,
        XHRReadyStateChangeRecordType = 8,
        XHRLoadRecordType = 9,
        EvaluateScriptTimelineRecordType = 10,
        MarkTimelineRecordType = 11,
        ResourceSendRequestTimelineRecordType = 12,
        ResourceReceiveResponseTimelineRecordType = 13,
        ResourceFinishTimelineRecordType = 14,
        FunctionCallTimelineRecordType = 15,
        ReceiveResourceDataTimelineRecordType = 16,
    };

    class InspectorTimelineAgent : public Noncopyable {
    public:
        InspectorTimelineAgent(InspectorFrontend* frontend);
        ~InspectorTimelineAgent();

        void reset();
        void resetFrontendProxyObject(InspectorFrontend*);

        // Methods called from WebCore.
        void willCallFunction(const String& scriptName, int scriptLine);
        void didCallFunction();

        void willDispatchEvent(const Event&);
        void didDispatchEvent();

        void willLayout();
        void didLayout();

        void willRecalculateStyle();
        void didRecalculateStyle();

        void willPaint(const IntRect&);
        void didPaint();

        void willWriteHTML(unsigned int length, unsigned int startLine);
        void didWriteHTML(unsigned int endLine);
        
        void didInstallTimer(int timerId, int timeout, bool singleShot);
        void didRemoveTimer(int timerId);
        void willFireTimer(int timerId);
        void didFireTimer();

        void willChangeXHRReadyState(const String&, int);
        void didChangeXHRReadyState();
        void willLoadXHR(const String&);
        void didLoadXHR();

        void willEvaluateScript(const String&, int);
        void didEvaluateScript();

        void didMarkTimeline(const String&);

        void willSendResourceRequest(unsigned long, bool isMainResource, const ResourceRequest&);
        void willReceiveResourceResponse(unsigned long, const ResourceResponse&);
        void didReceiveResourceResponse();
        void didFinishLoadingResource(unsigned long, bool didFail);
        void willReceiveResourceData(unsigned long identifier);
        void didReceiveResourceData();
        
        static int instanceCount() { return s_instanceCount; }
        static InspectorTimelineAgent* retrieve(ScriptExecutionContext*);

    private:
        struct TimelineRecordEntry {
            TimelineRecordEntry(ScriptObject record, ScriptObject data, ScriptArray children, TimelineRecordType type) : record(record), data(data), children(children), type(type) { }
            ScriptObject record;
            ScriptObject data;
            ScriptArray children;
            TimelineRecordType type;
        };
        
        void pushCurrentRecord(ScriptObject, TimelineRecordType);
        
        static double currentTimeInMilliseconds();

        void didCompleteCurrentRecord(TimelineRecordType);

        void addRecordToTimeline(ScriptObject, TimelineRecordType);

        InspectorFrontend* m_frontend;

        Vector< TimelineRecordEntry > m_recordStack;
        static int s_instanceCount;
    };

inline InspectorTimelineAgent* InspectorTimelineAgent::retrieve(ScriptExecutionContext* context)
{
    if (context && context->isDocument())
        return static_cast<Document*>(context)->inspectorTimelineAgent();
    return 0;
}

} // namespace WebCore

#endif // !ENABLE(INSPECTOR)
#endif // !defined(InspectorTimelineAgent_h)
