[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

commit-queue at webkit.org commit-queue at webkit.org
Wed Dec 22 13:48:37 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 31a8fb8a1fb22ed234cea532d6e255a6c4f51655
Author: commit-queue at webkit.org <commit-queue at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Sep 27 19:16:13 2010 +0000

    2010-09-27  Sheriff Bot  <webkit.review.bot at gmail.com>
    
            Unreviewed, rolling out r68389.
            http://trac.webkit.org/changeset/68389
            https://bugs.webkit.org/show_bug.cgi?id=46637
    
            test_shell is crashing on chromium Win (Requested by loislo on
            #webkit).
    
            * inspector/InspectorTimelineAgent.cpp:
            (WebCore::InspectorTimelineAgent::InspectorTimelineAgent):
            (WebCore::InspectorTimelineAgent::pushGCEventRecords):
            (WebCore::InspectorTimelineAgent::didGC):
            (WebCore::InspectorTimelineAgent::~InspectorTimelineAgent):
            (WebCore::InspectorTimelineAgent::willCallFunction):
            (WebCore::InspectorTimelineAgent::didCallFunction):
            (WebCore::InspectorTimelineAgent::willDispatchEvent):
            (WebCore::InspectorTimelineAgent::didDispatchEvent):
            (WebCore::InspectorTimelineAgent::willLayout):
            (WebCore::InspectorTimelineAgent::didLayout):
            (WebCore::InspectorTimelineAgent::willRecalculateStyle):
            (WebCore::InspectorTimelineAgent::didRecalculateStyle):
            (WebCore::InspectorTimelineAgent::willPaint):
            (WebCore::InspectorTimelineAgent::didPaint):
            (WebCore::InspectorTimelineAgent::willWriteHTML):
            (WebCore::InspectorTimelineAgent::didWriteHTML):
            (WebCore::InspectorTimelineAgent::didInstallTimer):
            (WebCore::InspectorTimelineAgent::didRemoveTimer):
            (WebCore::InspectorTimelineAgent::willFireTimer):
            (WebCore::InspectorTimelineAgent::didFireTimer):
            (WebCore::InspectorTimelineAgent::willChangeXHRReadyState):
            (WebCore::InspectorTimelineAgent::didChangeXHRReadyState):
            (WebCore::InspectorTimelineAgent::willLoadXHR):
            (WebCore::InspectorTimelineAgent::didLoadXHR):
            (WebCore::InspectorTimelineAgent::willEvaluateScript):
            (WebCore::InspectorTimelineAgent::didEvaluateScript):
            (WebCore::InspectorTimelineAgent::didScheduleResourceRequest):
            (WebCore::InspectorTimelineAgent::willSendResourceRequest):
            (WebCore::InspectorTimelineAgent::willReceiveResourceData):
            (WebCore::InspectorTimelineAgent::didReceiveResourceData):
            (WebCore::InspectorTimelineAgent::willReceiveResourceResponse):
            (WebCore::InspectorTimelineAgent::didReceiveResourceResponse):
            (WebCore::InspectorTimelineAgent::didFinishLoadingResource):
            (WebCore::InspectorTimelineAgent::didMarkTimeline):
            (WebCore::InspectorTimelineAgent::didMarkDOMContentEvent):
            (WebCore::InspectorTimelineAgent::didMarkLoadEvent):
            (WebCore::InspectorTimelineAgent::reset):
            (WebCore::InspectorTimelineAgent::resetFrontendProxyObject):
            (WebCore::InspectorTimelineAgent::addRecordToTimeline):
            (WebCore::InspectorTimelineAgent::setHeapSizeStatistic):
            (WebCore::InspectorTimelineAgent::didCompleteCurrentRecord):
            (WebCore::InspectorTimelineAgent::pushCurrentRecord):
            * inspector/InspectorTimelineAgent.h:
            (WebCore::InspectorTimelineAgent::TimelineRecordEntry::TimelineRecordEntry):
            (WebCore::InspectorTimelineAgent::GCEvent::GCEvent):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@68412 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index ebf62ef..56fa8d3 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,59 @@
+2010-09-27  Sheriff Bot  <webkit.review.bot at gmail.com>
+
+        Unreviewed, rolling out r68389.
+        http://trac.webkit.org/changeset/68389
+        https://bugs.webkit.org/show_bug.cgi?id=46637
+
+        test_shell is crashing on chromium Win (Requested by loislo on
+        #webkit).
+
+        * inspector/InspectorTimelineAgent.cpp:
+        (WebCore::InspectorTimelineAgent::InspectorTimelineAgent):
+        (WebCore::InspectorTimelineAgent::pushGCEventRecords):
+        (WebCore::InspectorTimelineAgent::didGC):
+        (WebCore::InspectorTimelineAgent::~InspectorTimelineAgent):
+        (WebCore::InspectorTimelineAgent::willCallFunction):
+        (WebCore::InspectorTimelineAgent::didCallFunction):
+        (WebCore::InspectorTimelineAgent::willDispatchEvent):
+        (WebCore::InspectorTimelineAgent::didDispatchEvent):
+        (WebCore::InspectorTimelineAgent::willLayout):
+        (WebCore::InspectorTimelineAgent::didLayout):
+        (WebCore::InspectorTimelineAgent::willRecalculateStyle):
+        (WebCore::InspectorTimelineAgent::didRecalculateStyle):
+        (WebCore::InspectorTimelineAgent::willPaint):
+        (WebCore::InspectorTimelineAgent::didPaint):
+        (WebCore::InspectorTimelineAgent::willWriteHTML):
+        (WebCore::InspectorTimelineAgent::didWriteHTML):
+        (WebCore::InspectorTimelineAgent::didInstallTimer):
+        (WebCore::InspectorTimelineAgent::didRemoveTimer):
+        (WebCore::InspectorTimelineAgent::willFireTimer):
+        (WebCore::InspectorTimelineAgent::didFireTimer):
+        (WebCore::InspectorTimelineAgent::willChangeXHRReadyState):
+        (WebCore::InspectorTimelineAgent::didChangeXHRReadyState):
+        (WebCore::InspectorTimelineAgent::willLoadXHR):
+        (WebCore::InspectorTimelineAgent::didLoadXHR):
+        (WebCore::InspectorTimelineAgent::willEvaluateScript):
+        (WebCore::InspectorTimelineAgent::didEvaluateScript):
+        (WebCore::InspectorTimelineAgent::didScheduleResourceRequest):
+        (WebCore::InspectorTimelineAgent::willSendResourceRequest):
+        (WebCore::InspectorTimelineAgent::willReceiveResourceData):
+        (WebCore::InspectorTimelineAgent::didReceiveResourceData):
+        (WebCore::InspectorTimelineAgent::willReceiveResourceResponse):
+        (WebCore::InspectorTimelineAgent::didReceiveResourceResponse):
+        (WebCore::InspectorTimelineAgent::didFinishLoadingResource):
+        (WebCore::InspectorTimelineAgent::didMarkTimeline):
+        (WebCore::InspectorTimelineAgent::didMarkDOMContentEvent):
+        (WebCore::InspectorTimelineAgent::didMarkLoadEvent):
+        (WebCore::InspectorTimelineAgent::reset):
+        (WebCore::InspectorTimelineAgent::resetFrontendProxyObject):
+        (WebCore::InspectorTimelineAgent::addRecordToTimeline):
+        (WebCore::InspectorTimelineAgent::setHeapSizeStatistic):
+        (WebCore::InspectorTimelineAgent::didCompleteCurrentRecord):
+        (WebCore::InspectorTimelineAgent::pushCurrentRecord):
+        * inspector/InspectorTimelineAgent.h:
+        (WebCore::InspectorTimelineAgent::TimelineRecordEntry::TimelineRecordEntry):
+        (WebCore::InspectorTimelineAgent::GCEvent::GCEvent):
+
 2010-09-27  Kinuko Yasuda  <kinuko at google.com>
 
         Reviewed by Adam Barth.
diff --git a/WebCore/inspector/InspectorTimelineAgent.cpp b/WebCore/inspector/InspectorTimelineAgent.cpp
index 6e85f86..fbb17c4 100644
--- a/WebCore/inspector/InspectorTimelineAgent.cpp
+++ b/WebCore/inspector/InspectorTimelineAgent.cpp
@@ -46,151 +46,15 @@ namespace WebCore {
 
 int InspectorTimelineAgent::s_instanceCount = 0;
 
-class InspectorTimelineAgent2 : ScriptGCEventListener, public Noncopyable {
-public:
-    InspectorTimelineAgent2(InspectorFrontend* frontend);
-    virtual ~InspectorTimelineAgent2();
-
-    void startNewRecord(PassRefPtr<InspectorObject>, TimelineRecordType);
-    void completeCurrentRecord(TimelineRecordType);
-    void addAtomicRecord(PassRefPtr<InspectorObject>, TimelineRecordType);
-    void pushOutOfOrderRecord(PassRefPtr<InspectorObject>, TimelineRecordType);
-    InspectorObject* getTopRecordData();
-    virtual void didGC(double, double, size_t);
-
-    void resetFrontendProxyObject(InspectorFrontend* frontend);
-    void reset();
-
-private:
-    struct TimelineRecordEntry {
-        TimelineRecordEntry(PassRefPtr<InspectorObject> record, PassRefPtr<InspectorObject> data, PassRefPtr<InspectorArray> children, TimelineRecordType type)
-            : record(record), data(data), children(children), type(type)
-        {
-        }
-        RefPtr<InspectorObject> record;
-        RefPtr<InspectorObject> data;
-        RefPtr<InspectorArray> children;
-        TimelineRecordType type;
-    };
-    Vector<TimelineRecordEntry> m_recordStack;
-
-    struct GCEvent {
-        GCEvent(double startTime, double endTime, size_t collectedBytes)
-            : startTime(startTime), endTime(endTime), collectedBytes(collectedBytes)
-        {
-        }
-        double startTime;
-        double endTime;
-        size_t collectedBytes;
-    };
-    typedef Vector<GCEvent> GCEvents;
-    GCEvents m_gcEvents;
-    InspectorFrontend* m_frontend;
-
-    void pushGCEventRecords();
-    void setHeapSizeStatistic(InspectorObject* record);
-    void addRecordToTimeline(PassRefPtr<InspectorObject> prpRecord, TimelineRecordType type);
-};
-
-InspectorTimelineAgent2::InspectorTimelineAgent2(InspectorFrontend* frontend)
+InspectorTimelineAgent::InspectorTimelineAgent(InspectorFrontend* frontend)
+    : m_frontend(frontend)
 {
-    m_frontend = frontend;
+    ++s_instanceCount;
     ScriptGCEvent::addEventListener(this);
+    ASSERT(m_frontend);
 }
 
-InspectorTimelineAgent2::~InspectorTimelineAgent2()
-{
-    ScriptGCEvent::removeEventListener(this);
-}
-
-void InspectorTimelineAgent2::didGC(double startTime, double endTime, size_t collectedBytesCount)
-{
-    m_gcEvents.append(GCEvent(startTime, endTime, collectedBytesCount));
-}
-
-void InspectorTimelineAgent2::addRecordToTimeline(PassRefPtr<InspectorObject> prpRecord, TimelineRecordType type)
-{
-    RefPtr<InspectorObject> record(prpRecord);
-    record->setNumber("type", type);
-    setHeapSizeStatistic(record.get());
-    if (m_recordStack.isEmpty())
-        m_frontend->addRecordToTimeline(record.release());
-    else {
-        TimelineRecordEntry parent = m_recordStack.last();
-        parent.children->pushObject(record.release());
-    }
-}
-
-void InspectorTimelineAgent2::setHeapSizeStatistic(InspectorObject* record)
-{
-    size_t usedHeapSize = 0;
-    size_t totalHeapSize = 0;
-    ScriptGCEvent::getHeapSize(usedHeapSize, totalHeapSize);
-    record->setNumber("usedHeapSize", usedHeapSize);
-    record->setNumber("totalHeapSize", totalHeapSize);
-}
-
-void InspectorTimelineAgent2::startNewRecord(PassRefPtr<InspectorObject> data, TimelineRecordType type)
-{
-    pushGCEventRecords();
-    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
-    m_recordStack.append(TimelineRecordEntry(record.release(), data, InspectorArray::create(), type));
-}
-
-void InspectorTimelineAgent2::completeCurrentRecord(TimelineRecordType type)
-{
-    // An empty stack could merely mean that the timeline agent was turned on in the middle of
-    // an event.  Don't treat as an error.
-    if (!m_recordStack.isEmpty()) {
-        pushGCEventRecords();
-        TimelineRecordEntry entry = m_recordStack.last();
-        m_recordStack.removeLast();
-        ASSERT(entry.type == type);
-        entry.record->setObject("data", entry.data);
-        entry.record->setArray("children", entry.children);
-        entry.record->setNumber("endTime", WTF::currentTimeMS());
-        addRecordToTimeline(entry.record, type);
-    }
-}
-
-void InspectorTimelineAgent2::pushOutOfOrderRecord(PassRefPtr<InspectorObject> data, TimelineRecordType recordType)
-{
-    pushGCEventRecords();
-    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
-    record->setObject("data", data);
-    record->setNumber("type", recordType);
-    setHeapSizeStatistic(record.get());
-    m_frontend->addRecordToTimeline(record.release());
-}
-
-void InspectorTimelineAgent2::addAtomicRecord(PassRefPtr<InspectorObject> data, TimelineRecordType recordType)
-{
-    pushGCEventRecords();
-    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
-    record->setObject("data", data);
-    addRecordToTimeline(record.release(), recordType);
-}
-
-InspectorObject* InspectorTimelineAgent2::getTopRecordData()
-{
-    if (m_recordStack.isEmpty())
-        return 0;
-    return m_recordStack.last().data.get();
-}
-
-void InspectorTimelineAgent2::reset()
-{
-    m_recordStack.clear();
-}
-
-void InspectorTimelineAgent2::resetFrontendProxyObject(InspectorFrontend* frontend)
-{
-    ASSERT(frontend);
-    reset();
-    m_frontend = frontend;
-}
-
-void InspectorTimelineAgent2::pushGCEventRecords()
+void InspectorTimelineAgent::pushGCEventRecords()
 {
     if (!m_gcEvents.size())
         return;
@@ -205,227 +69,267 @@ void InspectorTimelineAgent2::pushGCEventRecords()
     }
 }
 
-InspectorTimelineAgent::InspectorTimelineAgent(InspectorFrontend* frontend)
+void InspectorTimelineAgent::didGC(double startTime, double endTime, size_t collectedBytesCount)
 {
-    ++s_instanceCount;
-    m_timelineAgent = new InspectorTimelineAgent2(frontend);
+    m_gcEvents.append(GCEvent(startTime, endTime, collectedBytesCount));
 }
 
 InspectorTimelineAgent::~InspectorTimelineAgent()
 {
     ASSERT(s_instanceCount);
     --s_instanceCount;
-}
-
-void InspectorTimelineAgent::reset()
-{
-    if (m_timelineAgent)
-        m_timelineAgent->reset();
+    ScriptGCEvent::removeEventListener(this);
 }
 
 void InspectorTimelineAgent::willCallFunction(const String& scriptName, int scriptLine)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(TimelineRecordFactory::createFunctionCallData(scriptName, scriptLine), FunctionCallTimelineRecordType);
+    pushCurrentRecord(TimelineRecordFactory::createFunctionCallData(scriptName, scriptLine), FunctionCallTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didCallFunction()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(FunctionCallTimelineRecordType);
+    didCompleteCurrentRecord(FunctionCallTimelineRecordType);
 }
 
 void InspectorTimelineAgent::willDispatchEvent(const Event& event)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(TimelineRecordFactory::createEventDispatchData(event), EventDispatchTimelineRecordType);
+    pushCurrentRecord(TimelineRecordFactory::createEventDispatchData(event),
+        EventDispatchTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didDispatchEvent()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(EventDispatchTimelineRecordType);
+    didCompleteCurrentRecord(EventDispatchTimelineRecordType);
 }
 
 void InspectorTimelineAgent::willLayout()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(InspectorObject::create(), LayoutTimelineRecordType);
+    pushCurrentRecord(InspectorObject::create(), LayoutTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didLayout()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(LayoutTimelineRecordType);
+    didCompleteCurrentRecord(LayoutTimelineRecordType);
 }
 
 void InspectorTimelineAgent::willRecalculateStyle()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(InspectorObject::create(), RecalculateStylesTimelineRecordType);
+    pushCurrentRecord(InspectorObject::create(), RecalculateStylesTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didRecalculateStyle()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(RecalculateStylesTimelineRecordType);
+    didCompleteCurrentRecord(RecalculateStylesTimelineRecordType);
 }
 
 void InspectorTimelineAgent::willPaint(const IntRect& rect)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(TimelineRecordFactory::createPaintData(rect), PaintTimelineRecordType);
+    pushCurrentRecord(TimelineRecordFactory::createPaintData(rect), PaintTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didPaint()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(PaintTimelineRecordType);
+    didCompleteCurrentRecord(PaintTimelineRecordType);
 }
 
 void InspectorTimelineAgent::willWriteHTML(unsigned int length, unsigned int startLine)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(TimelineRecordFactory::createParseHTMLData(length, startLine), ParseHTMLTimelineRecordType);
+    pushCurrentRecord(TimelineRecordFactory::createParseHTMLData(length, startLine), ParseHTMLTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didWriteHTML(unsigned int endLine)
 {
-    if (m_timelineAgent) {
-        InspectorObject* data = m_timelineAgent->getTopRecordData();
-        if (data) {
-            data->setNumber("endLine", endLine);
-            m_timelineAgent->completeCurrentRecord(ParseHTMLTimelineRecordType);
-        }
+    if (!m_recordStack.isEmpty()) {
+        TimelineRecordEntry entry = m_recordStack.last();
+        entry.data->setNumber("endLine", endLine);
+        didCompleteCurrentRecord(ParseHTMLTimelineRecordType);
     }
 }
 
 void InspectorTimelineAgent::didInstallTimer(int timerId, int timeout, bool singleShot)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->addAtomicRecord(TimelineRecordFactory::createTimerInstallData(timerId, timeout, singleShot), TimerInstallTimelineRecordType);
+    pushGCEventRecords();
+    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
+    record->setObject("data", TimelineRecordFactory::createTimerInstallData(timerId, timeout, singleShot));
+    addRecordToTimeline(record.release(), TimerInstallTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didRemoveTimer(int timerId)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->addAtomicRecord(TimelineRecordFactory::createGenericTimerData(timerId), TimerRemoveTimelineRecordType);
+    pushGCEventRecords();
+    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
+    record->setObject("data", TimelineRecordFactory::createGenericTimerData(timerId));
+    addRecordToTimeline(record.release(), TimerRemoveTimelineRecordType);
 }
 
 void InspectorTimelineAgent::willFireTimer(int timerId)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(TimelineRecordFactory::createGenericTimerData(timerId), TimerFireTimelineRecordType);
+    pushCurrentRecord(TimelineRecordFactory::createGenericTimerData(timerId), TimerFireTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didFireTimer()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(TimerFireTimelineRecordType);
+    didCompleteCurrentRecord(TimerFireTimelineRecordType);
 }
 
 void InspectorTimelineAgent::willChangeXHRReadyState(const String& url, int readyState)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(TimelineRecordFactory::createXHRReadyStateChangeData(url, readyState), XHRReadyStateChangeRecordType);
+    pushCurrentRecord(TimelineRecordFactory::createXHRReadyStateChangeData(url, readyState), XHRReadyStateChangeRecordType);
 }
 
 void InspectorTimelineAgent::didChangeXHRReadyState()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(XHRReadyStateChangeRecordType);
+    didCompleteCurrentRecord(XHRReadyStateChangeRecordType);
 }
 
 void InspectorTimelineAgent::willLoadXHR(const String& url) 
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(TimelineRecordFactory::createXHRLoadData(url), XHRLoadRecordType);
+    pushCurrentRecord(TimelineRecordFactory::createXHRLoadData(url), XHRLoadRecordType);
 }
 
 void InspectorTimelineAgent::didLoadXHR()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(XHRLoadRecordType);
+    didCompleteCurrentRecord(XHRLoadRecordType);
 }
 
 void InspectorTimelineAgent::willEvaluateScript(const String& url, int lineNumber)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(TimelineRecordFactory::createEvaluateScriptData(url, lineNumber), EvaluateScriptTimelineRecordType);
+    pushCurrentRecord(TimelineRecordFactory::createEvaluateScriptData(url, lineNumber), EvaluateScriptTimelineRecordType);
 }
     
 void InspectorTimelineAgent::didEvaluateScript()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(EvaluateScriptTimelineRecordType);
+    didCompleteCurrentRecord(EvaluateScriptTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didScheduleResourceRequest(const String& url)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->addAtomicRecord(TimelineRecordFactory::createScheduleResourceRequestData(url), ScheduleResourceRequestTimelineRecordType);
+    pushGCEventRecords();
+    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
+    record->setObject("data", TimelineRecordFactory::createScheduleResourceRequestData(url));
+    record->setNumber("type", ScheduleResourceRequestTimelineRecordType);
+    addRecordToTimeline(record.release(), ScheduleResourceRequestTimelineRecordType);
 }
 
-void InspectorTimelineAgent::willSendResourceRequest(unsigned long identifier, bool isMainResource, const ResourceRequest& request)
+void InspectorTimelineAgent::willSendResourceRequest(unsigned long identifier, bool isMainResource,
+    const ResourceRequest& request)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->pushOutOfOrderRecord(TimelineRecordFactory::createResourceSendRequestData(identifier, isMainResource, request), ResourceSendRequestTimelineRecordType);
+    pushGCEventRecords();
+    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
+    record->setObject("data", TimelineRecordFactory::createResourceSendRequestData(identifier, isMainResource, request));
+    record->setNumber("type", ResourceSendRequestTimelineRecordType);
+    setHeapSizeStatistic(record.get());
+    m_frontend->addRecordToTimeline(record.release());
 }
 
 void InspectorTimelineAgent::willReceiveResourceData(unsigned long identifier)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(TimelineRecordFactory::createReceiveResourceData(identifier), ReceiveResourceDataTimelineRecordType);
+    pushCurrentRecord(TimelineRecordFactory::createReceiveResourceData(identifier), ReceiveResourceDataTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didReceiveResourceData()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(ReceiveResourceDataTimelineRecordType);
+    didCompleteCurrentRecord(ReceiveResourceDataTimelineRecordType);
 }
     
 void InspectorTimelineAgent::willReceiveResourceResponse(unsigned long identifier, const ResourceResponse& response)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->startNewRecord(TimelineRecordFactory::createResourceReceiveResponseData(identifier, response), ResourceReceiveResponseTimelineRecordType);
+    pushCurrentRecord(TimelineRecordFactory::createResourceReceiveResponseData(identifier, response), ResourceReceiveResponseTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didReceiveResourceResponse()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->completeCurrentRecord(ResourceReceiveResponseTimelineRecordType);
+    didCompleteCurrentRecord(ResourceReceiveResponseTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didFinishLoadingResource(unsigned long identifier, bool didFail)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->pushOutOfOrderRecord(TimelineRecordFactory::createResourceFinishData(identifier, didFail), ResourceFinishTimelineRecordType);
+    pushGCEventRecords();
+    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
+    record->setObject("data", TimelineRecordFactory::createResourceFinishData(identifier, didFail));
+    record->setNumber("type", ResourceFinishTimelineRecordType);
+    setHeapSizeStatistic(record.get());
+    m_frontend->addRecordToTimeline(record.release());
 }
 
 void InspectorTimelineAgent::didMarkTimeline(const String& message)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->addAtomicRecord(TimelineRecordFactory::createMarkTimelineData(message), MarkTimelineRecordType);
+    pushGCEventRecords();
+    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
+    record->setObject("data", TimelineRecordFactory::createMarkTimelineData(message));
+    addRecordToTimeline(record.release(), MarkTimelineRecordType);
 }
 
 void InspectorTimelineAgent::didMarkDOMContentEvent()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->addAtomicRecord(InspectorObject::create(), MarkDOMContentEventType);
+    pushGCEventRecords();
+    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
+    addRecordToTimeline(record.release(), MarkDOMContentEventType);
 }
 
 void InspectorTimelineAgent::didMarkLoadEvent()
 {
-    if (m_timelineAgent)
-        m_timelineAgent->addAtomicRecord(InspectorObject::create(), MarkLoadEventType);
+    pushGCEventRecords();
+    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
+    addRecordToTimeline(record.release(), MarkLoadEventType);
+}
+
+void InspectorTimelineAgent::reset()
+{
+    m_recordStack.clear();
 }
 
 void InspectorTimelineAgent::resetFrontendProxyObject(InspectorFrontend* frontend)
 {
-    if (m_timelineAgent)
-        m_timelineAgent->resetFrontendProxyObject(frontend);
+    ASSERT(frontend);
+    reset();
+    m_frontend = frontend;
+}
+
+void InspectorTimelineAgent::addRecordToTimeline(PassRefPtr<InspectorObject> prpRecord, TimelineRecordType type)
+{
+    RefPtr<InspectorObject> record(prpRecord);
+    record->setNumber("type", type);
+    setHeapSizeStatistic(record.get());
+    if (m_recordStack.isEmpty())
+        m_frontend->addRecordToTimeline(record.release());
+    else {
+        TimelineRecordEntry parent = m_recordStack.last();
+        parent.children->pushObject(record.release());
+    }
+}
+
+void InspectorTimelineAgent::setHeapSizeStatistic(InspectorObject* record)
+{
+    size_t usedHeapSize = 0;
+    size_t totalHeapSize = 0;
+    ScriptGCEvent::getHeapSize(usedHeapSize, totalHeapSize);
+    record->setNumber("usedHeapSize", usedHeapSize);
+    record->setNumber("totalHeapSize", totalHeapSize);
 }
 
+void InspectorTimelineAgent::didCompleteCurrentRecord(TimelineRecordType type)
+{
+    // An empty stack could merely mean that the timeline agent was turned on in the middle of
+    // an event.  Don't treat as an error.
+    if (!m_recordStack.isEmpty()) {
+        pushGCEventRecords();
+        TimelineRecordEntry entry = m_recordStack.last();
+        m_recordStack.removeLast();
+        ASSERT(entry.type == type);
+        entry.record->setObject("data", entry.data);
+        entry.record->setArray("children", entry.children);
+        entry.record->setNumber("endTime", WTF::currentTimeMS());
+        addRecordToTimeline(entry.record, type);
+    }
+}
+
+void InspectorTimelineAgent::pushCurrentRecord(PassRefPtr<InspectorObject> data, TimelineRecordType type)
+{
+    pushGCEventRecords();
+    RefPtr<InspectorObject> record = TimelineRecordFactory::createGenericRecord(WTF::currentTimeMS());
+    m_recordStack.append(TimelineRecordEntry(record.release(), data, InspectorArray::create(), type));
+}
 } // namespace WebCore
 
 #endif // ENABLE(INSPECTOR)
diff --git a/WebCore/inspector/InspectorTimelineAgent.h b/WebCore/inspector/InspectorTimelineAgent.h
index 65ca442..6b3324b 100644
--- a/WebCore/inspector/InspectorTimelineAgent.h
+++ b/WebCore/inspector/InspectorTimelineAgent.h
@@ -46,7 +46,6 @@ class InspectorFrontend;
 class IntRect;
 class ResourceRequest;
 class ResourceResponse;
-class InspectorTimelineAgent2;
 
 // Must be kept in sync with TimelineAgent.js
 enum TimelineRecordType {
@@ -73,7 +72,7 @@ enum TimelineRecordType {
     ScheduleResourceRequestTimelineRecordType = 20
 };
 
-class InspectorTimelineAgent : public Noncopyable {
+class InspectorTimelineAgent : ScriptGCEventListener, public Noncopyable {
 public:
     InspectorTimelineAgent(InspectorFrontend* frontend);
     ~InspectorTimelineAgent();
@@ -126,15 +125,48 @@ public:
     void didFinishLoadingResource(unsigned long, bool didFail);
     void willReceiveResourceData(unsigned long identifier);
     void didReceiveResourceData();
+        
+    virtual void didGC(double, double, size_t);
 
     static int instanceCount() { return s_instanceCount; }
     static InspectorTimelineAgent* retrieve(ScriptExecutionContext*);
 
 private:
-
+    struct TimelineRecordEntry {
+        TimelineRecordEntry(PassRefPtr<InspectorObject> record, PassRefPtr<InspectorObject> data, PassRefPtr<InspectorArray> children, TimelineRecordType type)
+            : record(record), data(data), children(children), type(type)
+        {
+        }
+        RefPtr<InspectorObject> record;
+        RefPtr<InspectorObject> data;
+        RefPtr<InspectorArray> children;
+        TimelineRecordType type;
+    };
+        
+    void pushCurrentRecord(PassRefPtr<InspectorObject>, TimelineRecordType);
+    void setHeapSizeStatistic(InspectorObject* record);
+        
+    void didCompleteCurrentRecord(TimelineRecordType);
+
+    void addRecordToTimeline(PassRefPtr<InspectorObject>, TimelineRecordType);
+
+    void pushGCEventRecords();
+
+    InspectorFrontend* m_frontend;
+
+    Vector<TimelineRecordEntry> m_recordStack;
     static int s_instanceCount;
-
-    OwnPtr<InspectorTimelineAgent2> m_timelineAgent;
+    struct GCEvent {
+        GCEvent(double startTime, double endTime, size_t collectedBytes)
+            : startTime(startTime), endTime(endTime), collectedBytes(collectedBytes)
+        {
+        }
+        double startTime;
+        double endTime;
+        size_t collectedBytes;
+    };
+    typedef Vector<GCEvent> GCEvents;
+    GCEvents m_gcEvents;
 };
 
 inline InspectorTimelineAgent* InspectorTimelineAgent::retrieve(ScriptExecutionContext* context)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list