Diff
Modified: trunk/Source/WebCore/ChangeLog (143327 => 143328)
--- trunk/Source/WebCore/ChangeLog 2013-02-19 14:59:38 UTC (rev 143327)
+++ trunk/Source/WebCore/ChangeLog 2013-02-19 15:13:42 UTC (rev 143328)
@@ -1,3 +1,31 @@
+2013-02-19 Andrey Adaikin <aand...@chromium.org>
+
+ 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):
+
2013-02-19 Vsevolod Vlasov <vse...@chromium.org>
Web Inspector: Decouple various file system project implementation parts for better testability and cover with tests.
Modified: trunk/Source/WebCore/inspector/InjectedScriptCanvasModule.cpp (143327 => 143328)
--- trunk/Source/WebCore/inspector/InjectedScriptCanvasModule.cpp 2013-02-19 14:59:38 UTC (rev 143327)
+++ trunk/Source/WebCore/inspector/InjectedScriptCanvasModule.cpp 2013-02-19 15:13:42 UTC (rev 143328)
@@ -91,6 +91,14 @@
return ScriptObject(context.scriptState(), resultValue);
}
+void InjectedScriptCanvasModule::markFrameEnd()
+{
+ ScriptFunctionCall function(injectedScriptObject(), "markFrameEnd");
+ RefPtr<InspectorValue> resultValue;
+ makeCall(function, &resultValue);
+ ASSERT(resultValue);
+}
+
void InjectedScriptCanvasModule::captureFrame(ErrorString* errorString, TraceLogId* traceLogId)
{
callStartCapturingFunction("captureFrame", errorString, traceLogId);
Modified: trunk/Source/WebCore/inspector/InjectedScriptCanvasModule.h (143327 => 143328)
--- trunk/Source/WebCore/inspector/InjectedScriptCanvasModule.h 2013-02-19 14:59:38 UTC (rev 143327)
+++ trunk/Source/WebCore/inspector/InjectedScriptCanvasModule.h 2013-02-19 15:13:42 UTC (rev 143328)
@@ -54,6 +54,7 @@
#if ENABLE(WEBGL)
ScriptObject wrapWebGLContext(const ScriptObject&);
#endif
+ void markFrameEnd();
void captureFrame(ErrorString*, TypeBuilder::Canvas::TraceLogId*);
void startCapturing(ErrorString*, TypeBuilder::Canvas::TraceLogId*);
Modified: trunk/Source/WebCore/inspector/InjectedScriptCanvasModuleSource.js (143327 => 143328)
--- trunk/Source/WebCore/inspector/InjectedScriptCanvasModuleSource.js 2013-02-19 14:59:38 UTC (rev 143327)
+++ trunk/Source/WebCore/inspector/InjectedScriptCanvasModuleSource.js 2013-02-19 15:13:42 UTC (rev 143328)
@@ -2866,52 +2866,12 @@
/**
* @constructor
- * @param {function()} callback
*/
-function ZeroTimeoutCallback(callback)
-{
- this._callback = callback;
- this._scheduled = false;
-}
-
-ZeroTimeoutCallback.prototype = {
- schedule: function()
- {
- if (this._scheduled)
- return;
- this._scheduled = true;
- var callback = this._onCallback.bind(this);
- // We need a fastest async callback, whatever fires first.
- // Usually a postMessage should be faster than a setTimeout(0).
- var channel = new MessageChannel();
- channel.port1._onmessage_ = callback;
- channel.port2.postMessage("");
- inspectedWindow.setTimeout(callback, 0);
- },
-
- cancel: function()
- {
- this._scheduled = false;
- },
-
- _onCallback: function()
- {
- if (!this._scheduled)
- return;
- this._scheduled = false;
- this._callback();
- }
-}
-
-/**
- * @constructor
- */
function ResourceTrackingManager()
{
this._capturing = false;
this._stopCapturingOnFrameEnd = false;
this._lastTraceLog = null;
- this._frameEndScheduler = new ZeroTimeoutCallback(this.markFrameEnd.bind(this));
}
ResourceTrackingManager.prototype = {
@@ -2956,7 +2916,6 @@
return;
this._capturing = false;
this._stopCapturingOnFrameEnd = false;
- this._frameEndScheduler.cancel();
if (this._lastTraceLog)
this._lastTraceLog.addFrameEndMark();
},
@@ -3002,7 +2961,6 @@
if (!this._capturing)
return;
this._lastTraceLog.addCall(call);
- this._frameEndScheduler.schedule();
},
markFrameEnd: function()
@@ -3010,7 +2968,7 @@
if (!this._lastTraceLog)
return;
this._lastTraceLog.addFrameEndMark();
- if (this._stopCapturingOnFrameEnd)
+ if (this._stopCapturingOnFrameEnd && this._lastTraceLog.size())
this.stopCapturing(this._lastTraceLog);
}
}
@@ -3069,6 +3027,11 @@
return this._callStartCapturingFunction(this._manager.startCapturing);
},
+ markFrameEnd: function()
+ {
+ this._manager.markFrameEnd();
+ },
+
/**
* @param {function(this:ResourceTrackingManager)} func
* @return {CanvasAgent.TraceLogId}
Modified: trunk/Source/WebCore/inspector/InspectorCanvasAgent.cpp (143327 => 143328)
--- trunk/Source/WebCore/inspector/InspectorCanvasAgent.cpp 2013-02-19 14:59:38 UTC (rev 143327)
+++ trunk/Source/WebCore/inspector/InspectorCanvasAgent.cpp 2013-02-19 15:13:42 UTC (rev 143328)
@@ -127,7 +127,13 @@
{
if (!checkIsEnabled(errorString))
return;
- *result = !m_framesWithUninstrumentedCanvases.isEmpty();
+ for (FramesWithUninstrumentedCanvases::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) {
+ if (it->value) {
+ *result = true;
+ return;
+ }
+ }
+ *result = false;
}
void InspectorCanvasAgent::captureFrame(ErrorString* errorString, const FrameId* frameId, TraceLogId* traceLogId)
@@ -211,6 +217,8 @@
ScriptState* scriptState = wrappedContext.scriptState();
DOMWindow* domWindow = scriptState ? domWindowFromScriptState(scriptState) : 0;
Frame* frame = domWindow ? domWindow->frame() : 0;
+ if (frame && !m_framesWithUninstrumentedCanvases.contains(frame))
+ m_framesWithUninstrumentedCanvases.set(frame, false);
String frameId = m_pageAgent->frameId(frame);
if (!frameId.isEmpty())
m_frontend->contextCreated(frameId);
@@ -257,7 +265,7 @@
{
class NodeVisitor : public WrappedNodeVisitor {
public:
- NodeVisitor(Page* page, HashSet<Frame*>& result)
+ NodeVisitor(Page* page, FramesWithUninstrumentedCanvases& result)
: m_page(page)
, m_framesWithUninstrumentedCanvases(result)
{
@@ -274,19 +282,19 @@
HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(node);
if (canvas->renderingContext())
- m_framesWithUninstrumentedCanvases.add(frame);
+ m_framesWithUninstrumentedCanvases.set(frame, true);
}
private:
Page* m_page;
- HashSet<Frame*>& m_framesWithUninstrumentedCanvases;
+ FramesWithUninstrumentedCanvases& m_framesWithUninstrumentedCanvases;
} nodeVisitor(m_pageAgent->page(), m_framesWithUninstrumentedCanvases);
m_framesWithUninstrumentedCanvases.clear();
ScriptProfiler::visitNodeWrappers(&nodeVisitor);
- for (HashSet<Frame*>::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) {
- String frameId = m_pageAgent->frameId(*it);
+ for (FramesWithUninstrumentedCanvases::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) {
+ String frameId = m_pageAgent->frameId(it->key);
if (!frameId.isEmpty())
m_frontend->contextCreated(frameId);
}
@@ -305,11 +313,13 @@
if (!m_enabled)
return;
if (frame == m_pageAgent->mainFrame()) {
- m_framesWithUninstrumentedCanvases.clear();
+ for (FramesWithUninstrumentedCanvases::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it)
+ m_framesWithUninstrumentedCanvases.set(it->key, false);
m_frontend->traceLogsRemoved(0, 0);
} else {
while (frame) {
- m_framesWithUninstrumentedCanvases.remove(frame);
+ if (m_framesWithUninstrumentedCanvases.contains(frame))
+ m_framesWithUninstrumentedCanvases.set(frame, false);
if (m_pageAgent->hasIdForFrame(frame)) {
String frameId = m_pageAgent->frameId(frame);
m_frontend->traceLogsRemoved(&frameId, 0);
@@ -325,6 +335,18 @@
m_framesWithUninstrumentedCanvases.remove(frame);
}
+void InspectorCanvasAgent::didBeginFrame()
+{
+ if (!m_enabled)
+ return;
+ ErrorString error;
+ for (FramesWithUninstrumentedCanvases::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) {
+ InjectedScriptCanvasModule module = injectedScriptCanvasModule(&error, mainWorldScriptState(it->key));
+ if (!module.hasNoValue())
+ module.markFrameEnd();
+ }
+}
+
} // namespace WebCore
#endif // ENABLE(INSPECTOR)
Modified: trunk/Source/WebCore/inspector/InspectorCanvasAgent.h (143327 => 143328)
--- trunk/Source/WebCore/inspector/InspectorCanvasAgent.h 2013-02-19 14:59:38 UTC (rev 143327)
+++ trunk/Source/WebCore/inspector/InspectorCanvasAgent.h 2013-02-19 15:13:42 UTC (rev 143328)
@@ -37,7 +37,7 @@
#include "InspectorFrontend.h"
#include "InspectorTypeBuilder.h"
#include "ScriptState.h"
-#include <wtf/HashSet.h>
+#include <wtf/HashMap.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/PassRefPtr.h>
#include <wtf/text/WTFString.h>
@@ -66,11 +66,11 @@
virtual void clearFrontend();
virtual void restore();
- // Called from InspectorInstrumentation
void frameNavigated(Frame*);
void frameDetached(Frame*);
+ void didBeginFrame();
- // Called from InspectorCanvasInstrumentation
+ // Called from InspectorCanvasInstrumentation.
ScriptObject wrapCanvas2DRenderingContextForInstrumentation(const ScriptObject&);
#if ENABLE(WEBGL)
ScriptObject wrapWebGLRenderingContextForInstrumentation(const ScriptObject&);
@@ -104,7 +104,9 @@
InjectedScriptManager* m_injectedScriptManager;
InspectorFrontend::Canvas* m_frontend;
bool m_enabled;
- HashSet<Frame*> m_framesWithUninstrumentedCanvases;
+ // Contains all frames with canvases, value is true only for frames that have an uninstrumented canvas.
+ typedef HashMap<Frame*, bool> FramesWithUninstrumentedCanvases;
+ FramesWithUninstrumentedCanvases m_framesWithUninstrumentedCanvases;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/inspector/InspectorController.cpp (143327 => 143328)
--- trunk/Source/WebCore/inspector/InspectorController.cpp 2013-02-19 14:59:38 UTC (rev 143327)
+++ trunk/Source/WebCore/inspector/InspectorController.cpp 2013-02-19 15:13:42 UTC (rev 143328)
@@ -450,6 +450,8 @@
{
if (InspectorTimelineAgent* timelineAgent = m_instrumentingAgents->inspectorTimelineAgent())
timelineAgent->didBeginFrame();
+ if (InspectorCanvasAgent* canvasAgent = m_instrumentingAgents->inspectorCanvasAgent())
+ canvasAgent->didBeginFrame();
}
void InspectorController::didCancelFrame()