Changeset 143328 in webkit


Ignore:
Timestamp:
Feb 19, 2013 7:13:42 AM (11 years ago)
Author:
aandrey@chromium.org
Message:

Web Inspector: [Canvas] use timeline's didBeginFrame for marking frame end calls
https://bugs.webkit.org/show_bug.cgi?id=110130

Reviewed by Pavel Feldman.

In Web Inspector canvas profiler use timeline's didBeginFrame for marking frame end calls instead of an ad-hoc timeout-based solution.

  • inspector/InjectedScriptCanvasModule.cpp:

(WebCore::InjectedScriptCanvasModule::markFrameEnd):
(WebCore):

  • inspector/InjectedScriptCanvasModule.h:

(InjectedScriptCanvasModule):

  • inspector/InjectedScriptCanvasModuleSource.js:

(.):

  • inspector/InspectorCanvasAgent.cpp:

(WebCore::InspectorCanvasAgent::hasUninstrumentedCanvases):
(WebCore::InspectorCanvasAgent::notifyRenderingContextWasWrapped):
(WebCore::InspectorCanvasAgent::findFramesWithUninstrumentedCanvases):
(WebCore::InspectorCanvasAgent::frameNavigated):
(WebCore::InspectorCanvasAgent::didBeginFrame):
(WebCore):

  • inspector/InspectorCanvasAgent.h:

(InspectorCanvasAgent):

  • inspector/InspectorController.cpp:

(WebCore::InspectorController::didBeginFrame):

Location:
trunk/Source/WebCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r143327 r143328  
     12013-02-19  Andrey Adaikin  <aandrey@chromium.org>
     2
     3        Web Inspector: [Canvas] use timeline's didBeginFrame for marking frame end calls
     4        https://bugs.webkit.org/show_bug.cgi?id=110130
     5
     6        Reviewed by Pavel Feldman.
     7
     8        In Web Inspector canvas profiler use timeline's didBeginFrame for marking frame end calls instead of an ad-hoc timeout-based solution.
     9
     10        * inspector/InjectedScriptCanvasModule.cpp:
     11        (WebCore::InjectedScriptCanvasModule::markFrameEnd):
     12        (WebCore):
     13        * inspector/InjectedScriptCanvasModule.h:
     14        (InjectedScriptCanvasModule):
     15        * inspector/InjectedScriptCanvasModuleSource.js:
     16        (.):
     17        * inspector/InspectorCanvasAgent.cpp:
     18        (WebCore::InspectorCanvasAgent::hasUninstrumentedCanvases):
     19        (WebCore::InspectorCanvasAgent::notifyRenderingContextWasWrapped):
     20        (WebCore::InspectorCanvasAgent::findFramesWithUninstrumentedCanvases):
     21        (WebCore::InspectorCanvasAgent::frameNavigated):
     22        (WebCore::InspectorCanvasAgent::didBeginFrame):
     23        (WebCore):
     24        * inspector/InspectorCanvasAgent.h:
     25        (InspectorCanvasAgent):
     26        * inspector/InspectorController.cpp:
     27        (WebCore::InspectorController::didBeginFrame):
     28
    1292013-02-19  Vsevolod Vlasov  <vsevik@chromium.org>
    230
  • trunk/Source/WebCore/inspector/InjectedScriptCanvasModule.cpp

    r141403 r143328  
    9292}
    9393
     94void InjectedScriptCanvasModule::markFrameEnd()
     95{
     96    ScriptFunctionCall function(injectedScriptObject(), "markFrameEnd");
     97    RefPtr<InspectorValue> resultValue;
     98    makeCall(function, &resultValue);
     99    ASSERT(resultValue);
     100}
     101
    94102void InjectedScriptCanvasModule::captureFrame(ErrorString* errorString, TraceLogId* traceLogId)
    95103{
  • trunk/Source/WebCore/inspector/InjectedScriptCanvasModule.h

    r141403 r143328  
    5555    ScriptObject wrapWebGLContext(const ScriptObject&);
    5656#endif
     57    void markFrameEnd();
    5758
    5859    void captureFrame(ErrorString*, TypeBuilder::Canvas::TraceLogId*);
  • trunk/Source/WebCore/inspector/InjectedScriptCanvasModuleSource.js

    r143206 r143328  
    28672867/**
    28682868 * @constructor
    2869  * @param {function()} callback
    2870  */
    2871 function ZeroTimeoutCallback(callback)
    2872 {
    2873     this._callback = callback;
    2874     this._scheduled = false;
    2875 }
    2876 
    2877 ZeroTimeoutCallback.prototype = {
    2878     schedule: function()
    2879     {
    2880         if (this._scheduled)
    2881             return;
    2882         this._scheduled = true;
    2883         var callback = this._onCallback.bind(this);
    2884         // We need a fastest async callback, whatever fires first.
    2885         // Usually a postMessage should be faster than a setTimeout(0).
    2886         var channel = new MessageChannel();
    2887         channel.port1.onmessage = callback;
    2888         channel.port2.postMessage("");
    2889         inspectedWindow.setTimeout(callback, 0);
    2890     },
    2891 
    2892     cancel: function()
    2893     {
    2894         this._scheduled = false;
    2895     },
    2896 
    2897     _onCallback: function()
    2898     {
    2899         if (!this._scheduled)
    2900             return;
    2901         this._scheduled = false;
    2902         this._callback();
    2903     }
    2904 }
    2905 
    2906 /**
    2907  * @constructor
    29082869 */
    29092870function ResourceTrackingManager()
     
    29122873    this._stopCapturingOnFrameEnd = false;
    29132874    this._lastTraceLog = null;
    2914     this._frameEndScheduler = new ZeroTimeoutCallback(this.markFrameEnd.bind(this));
    29152875}
    29162876
     
    29572917        this._capturing = false;
    29582918        this._stopCapturingOnFrameEnd = false;
    2959         this._frameEndScheduler.cancel();
    29602919        if (this._lastTraceLog)
    29612920            this._lastTraceLog.addFrameEndMark();
     
    30032962            return;
    30042963        this._lastTraceLog.addCall(call);
    3005         this._frameEndScheduler.schedule();
    30062964    },
    30072965
     
    30112969            return;
    30122970        this._lastTraceLog.addFrameEndMark();
    3013         if (this._stopCapturingOnFrameEnd)
     2971        if (this._stopCapturingOnFrameEnd && this._lastTraceLog.size())
    30142972            this.stopCapturing(this._lastTraceLog);
    30152973    }
     
    30683026    {
    30693027        return this._callStartCapturingFunction(this._manager.startCapturing);
     3028    },
     3029
     3030    markFrameEnd: function()
     3031    {
     3032        this._manager.markFrameEnd();
    30703033    },
    30713034
  • trunk/Source/WebCore/inspector/InspectorCanvasAgent.cpp

    r141403 r143328  
    128128    if (!checkIsEnabled(errorString))
    129129        return;
    130     *result = !m_framesWithUninstrumentedCanvases.isEmpty();
     130    for (FramesWithUninstrumentedCanvases::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) {
     131        if (it->value) {
     132            *result = true;
     133            return;
     134        }
     135    }
     136    *result = false;
    131137}
    132138
     
    212218    DOMWindow* domWindow = scriptState ? domWindowFromScriptState(scriptState) : 0;
    213219    Frame* frame = domWindow ? domWindow->frame() : 0;
     220    if (frame && !m_framesWithUninstrumentedCanvases.contains(frame))
     221        m_framesWithUninstrumentedCanvases.set(frame, false);
    214222    String frameId = m_pageAgent->frameId(frame);
    215223    if (!frameId.isEmpty())
     
    258266    class NodeVisitor : public WrappedNodeVisitor {
    259267    public:
    260         NodeVisitor(Page* page, HashSet<Frame*>& result)
     268        NodeVisitor(Page* page, FramesWithUninstrumentedCanvases& result)
    261269            : m_page(page)
    262270            , m_framesWithUninstrumentedCanvases(result)
     
    275283            HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(node);
    276284            if (canvas->renderingContext())
    277                 m_framesWithUninstrumentedCanvases.add(frame);
     285                m_framesWithUninstrumentedCanvases.set(frame, true);
    278286        }
    279287
    280288    private:
    281289        Page* m_page;
    282         HashSet<Frame*>& m_framesWithUninstrumentedCanvases;
     290        FramesWithUninstrumentedCanvases& m_framesWithUninstrumentedCanvases;
    283291    } nodeVisitor(m_pageAgent->page(), m_framesWithUninstrumentedCanvases);
    284292
     
    286294    ScriptProfiler::visitNodeWrappers(&nodeVisitor);
    287295
    288     for (HashSet<Frame*>::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) {
    289         String frameId = m_pageAgent->frameId(*it);
     296    for (FramesWithUninstrumentedCanvases::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) {
     297        String frameId = m_pageAgent->frameId(it->key);
    290298        if (!frameId.isEmpty())
    291299            m_frontend->contextCreated(frameId);
     
    306314        return;
    307315    if (frame == m_pageAgent->mainFrame()) {
    308         m_framesWithUninstrumentedCanvases.clear();
     316        for (FramesWithUninstrumentedCanvases::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it)
     317            m_framesWithUninstrumentedCanvases.set(it->key, false);
    309318        m_frontend->traceLogsRemoved(0, 0);
    310319    } else {
    311320        while (frame) {
    312             m_framesWithUninstrumentedCanvases.remove(frame);
     321            if (m_framesWithUninstrumentedCanvases.contains(frame))
     322                m_framesWithUninstrumentedCanvases.set(frame, false);
    313323            if (m_pageAgent->hasIdForFrame(frame)) {
    314324                String frameId = m_pageAgent->frameId(frame);
     
    326336}
    327337
     338void InspectorCanvasAgent::didBeginFrame()
     339{
     340    if (!m_enabled)
     341        return;
     342    ErrorString error;
     343    for (FramesWithUninstrumentedCanvases::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) {
     344        InjectedScriptCanvasModule module = injectedScriptCanvasModule(&error, mainWorldScriptState(it->key));
     345        if (!module.hasNoValue())
     346            module.markFrameEnd();
     347    }
     348}
     349
    328350} // namespace WebCore
    329351
  • trunk/Source/WebCore/inspector/InspectorCanvasAgent.h

    r141403 r143328  
    3838#include "InspectorTypeBuilder.h"
    3939#include "ScriptState.h"
    40 #include <wtf/HashSet.h>
     40#include <wtf/HashMap.h>
    4141#include <wtf/PassOwnPtr.h>
    4242#include <wtf/PassRefPtr.h>
     
    6767    virtual void restore();
    6868
    69     // Called from InspectorInstrumentation
    7069    void frameNavigated(Frame*);
    7170    void frameDetached(Frame*);
     71    void didBeginFrame();
    7272
    73     // Called from InspectorCanvasInstrumentation
     73    // Called from InspectorCanvasInstrumentation.
    7474    ScriptObject wrapCanvas2DRenderingContextForInstrumentation(const ScriptObject&);
    7575#if ENABLE(WEBGL)
     
    105105    InspectorFrontend::Canvas* m_frontend;
    106106    bool m_enabled;
    107     HashSet<Frame*> m_framesWithUninstrumentedCanvases;
     107    // Contains all frames with canvases, value is true only for frames that have an uninstrumented canvas.
     108    typedef HashMap<Frame*, bool> FramesWithUninstrumentedCanvases;
     109    FramesWithUninstrumentedCanvases m_framesWithUninstrumentedCanvases;
    108110};
    109111
  • trunk/Source/WebCore/inspector/InspectorController.cpp

    r142879 r143328  
    451451    if (InspectorTimelineAgent* timelineAgent = m_instrumentingAgents->inspectorTimelineAgent())
    452452        timelineAgent->didBeginFrame();
     453    if (InspectorCanvasAgent* canvasAgent = m_instrumentingAgents->inspectorCanvasAgent())
     454        canvasAgent->didBeginFrame();
    453455}
    454456
Note: See TracChangeset for help on using the changeset viewer.