Changeset 143328 in webkit
- Timestamp:
- Feb 19, 2013 7:13:42 AM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r143327 r143328 1 2013-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 1 29 2013-02-19 Vsevolod Vlasov <vsevik@chromium.org> 2 30 -
trunk/Source/WebCore/inspector/InjectedScriptCanvasModule.cpp
r141403 r143328 92 92 } 93 93 94 void InjectedScriptCanvasModule::markFrameEnd() 95 { 96 ScriptFunctionCall function(injectedScriptObject(), "markFrameEnd"); 97 RefPtr<InspectorValue> resultValue; 98 makeCall(function, &resultValue); 99 ASSERT(resultValue); 100 } 101 94 102 void InjectedScriptCanvasModule::captureFrame(ErrorString* errorString, TraceLogId* traceLogId) 95 103 { -
trunk/Source/WebCore/inspector/InjectedScriptCanvasModule.h
r141403 r143328 55 55 ScriptObject wrapWebGLContext(const ScriptObject&); 56 56 #endif 57 void markFrameEnd(); 57 58 58 59 void captureFrame(ErrorString*, TypeBuilder::Canvas::TraceLogId*); -
trunk/Source/WebCore/inspector/InjectedScriptCanvasModuleSource.js
r143206 r143328 2867 2867 /** 2868 2868 * @constructor 2869 * @param {function()} callback2870 */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 * @constructor2908 2869 */ 2909 2870 function ResourceTrackingManager() … … 2912 2873 this._stopCapturingOnFrameEnd = false; 2913 2874 this._lastTraceLog = null; 2914 this._frameEndScheduler = new ZeroTimeoutCallback(this.markFrameEnd.bind(this));2915 2875 } 2916 2876 … … 2957 2917 this._capturing = false; 2958 2918 this._stopCapturingOnFrameEnd = false; 2959 this._frameEndScheduler.cancel();2960 2919 if (this._lastTraceLog) 2961 2920 this._lastTraceLog.addFrameEndMark(); … … 3003 2962 return; 3004 2963 this._lastTraceLog.addCall(call); 3005 this._frameEndScheduler.schedule();3006 2964 }, 3007 2965 … … 3011 2969 return; 3012 2970 this._lastTraceLog.addFrameEndMark(); 3013 if (this._stopCapturingOnFrameEnd )2971 if (this._stopCapturingOnFrameEnd && this._lastTraceLog.size()) 3014 2972 this.stopCapturing(this._lastTraceLog); 3015 2973 } … … 3068 3026 { 3069 3027 return this._callStartCapturingFunction(this._manager.startCapturing); 3028 }, 3029 3030 markFrameEnd: function() 3031 { 3032 this._manager.markFrameEnd(); 3070 3033 }, 3071 3034 -
trunk/Source/WebCore/inspector/InspectorCanvasAgent.cpp
r141403 r143328 128 128 if (!checkIsEnabled(errorString)) 129 129 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; 131 137 } 132 138 … … 212 218 DOMWindow* domWindow = scriptState ? domWindowFromScriptState(scriptState) : 0; 213 219 Frame* frame = domWindow ? domWindow->frame() : 0; 220 if (frame && !m_framesWithUninstrumentedCanvases.contains(frame)) 221 m_framesWithUninstrumentedCanvases.set(frame, false); 214 222 String frameId = m_pageAgent->frameId(frame); 215 223 if (!frameId.isEmpty()) … … 258 266 class NodeVisitor : public WrappedNodeVisitor { 259 267 public: 260 NodeVisitor(Page* page, HashSet<Frame*>& result)268 NodeVisitor(Page* page, FramesWithUninstrumentedCanvases& result) 261 269 : m_page(page) 262 270 , m_framesWithUninstrumentedCanvases(result) … … 275 283 HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(node); 276 284 if (canvas->renderingContext()) 277 m_framesWithUninstrumentedCanvases. add(frame);285 m_framesWithUninstrumentedCanvases.set(frame, true); 278 286 } 279 287 280 288 private: 281 289 Page* m_page; 282 HashSet<Frame*>& m_framesWithUninstrumentedCanvases;290 FramesWithUninstrumentedCanvases& m_framesWithUninstrumentedCanvases; 283 291 } nodeVisitor(m_pageAgent->page(), m_framesWithUninstrumentedCanvases); 284 292 … … 286 294 ScriptProfiler::visitNodeWrappers(&nodeVisitor); 287 295 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); 290 298 if (!frameId.isEmpty()) 291 299 m_frontend->contextCreated(frameId); … … 306 314 return; 307 315 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); 309 318 m_frontend->traceLogsRemoved(0, 0); 310 319 } else { 311 320 while (frame) { 312 m_framesWithUninstrumentedCanvases.remove(frame); 321 if (m_framesWithUninstrumentedCanvases.contains(frame)) 322 m_framesWithUninstrumentedCanvases.set(frame, false); 313 323 if (m_pageAgent->hasIdForFrame(frame)) { 314 324 String frameId = m_pageAgent->frameId(frame); … … 326 336 } 327 337 338 void 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 328 350 } // namespace WebCore 329 351 -
trunk/Source/WebCore/inspector/InspectorCanvasAgent.h
r141403 r143328 38 38 #include "InspectorTypeBuilder.h" 39 39 #include "ScriptState.h" 40 #include <wtf/Hash Set.h>40 #include <wtf/HashMap.h> 41 41 #include <wtf/PassOwnPtr.h> 42 42 #include <wtf/PassRefPtr.h> … … 67 67 virtual void restore(); 68 68 69 // Called from InspectorInstrumentation70 69 void frameNavigated(Frame*); 71 70 void frameDetached(Frame*); 71 void didBeginFrame(); 72 72 73 // Called from InspectorCanvasInstrumentation 73 // Called from InspectorCanvasInstrumentation. 74 74 ScriptObject wrapCanvas2DRenderingContextForInstrumentation(const ScriptObject&); 75 75 #if ENABLE(WEBGL) … … 105 105 InspectorFrontend::Canvas* m_frontend; 106 106 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; 108 110 }; 109 111 -
trunk/Source/WebCore/inspector/InspectorController.cpp
r142879 r143328 451 451 if (InspectorTimelineAgent* timelineAgent = m_instrumentingAgents->inspectorTimelineAgent()) 452 452 timelineAgent->didBeginFrame(); 453 if (InspectorCanvasAgent* canvasAgent = m_instrumentingAgents->inspectorCanvasAgent()) 454 canvasAgent->didBeginFrame(); 453 455 } 454 456
Note: See TracChangeset
for help on using the changeset viewer.