- Revision
- 94306
- Author
- [email protected]
- Date
- 2011-09-01 10:36:12 -0700 (Thu, 01 Sep 2011)
Log Message
[Chromium] Web Inspector: dedicated worker inspection is broken
https://bugs.webkit.org/show_bug.cgi?id=67279
Provide transport for inspector messages between Page and DedicatedWorker inspectors
in case of in-process workers.
Reviewed by Pavel Feldman.
* inspector/CodeGeneratorInspector.pm: sendMessageObjectToBackend should accept message
object which is ready for sending to backend. This method is overriden in WorkerManager
for dedicated workers and we don't want to replicate request id assignment there.
* workers/WorkerMessagingProxy.cpp:
(WebCore::PostMessageToPageInspectorTask::create):
(WebCore::PostMessageToPageInspectorTask::PostMessageToPageInspectorTask):
(WebCore::PostMessageToPageInspectorTask::performTask):
(WebCore::WorkerMessagingProxy::WorkerMessagingProxy):
(WebCore::connectToWorkerContextInspectorTask):
(WebCore::WorkerMessagingProxy::connectToInspector):
(WebCore::disconnectFromWorkerContextInspectorTask):
(WebCore::WorkerMessagingProxy::disconnectFromInspector):
(WebCore::dispatchOnInspectorBackendTask):
(WebCore::WorkerMessagingProxy::sendMessageToInspector):
(WebCore::WorkerMessagingProxy::postMessageToPageInspector):
* workers/WorkerMessagingProxy.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (94305 => 94306)
--- trunk/Source/WebCore/ChangeLog 2011-09-01 17:25:41 UTC (rev 94305)
+++ trunk/Source/WebCore/ChangeLog 2011-09-01 17:36:12 UTC (rev 94306)
@@ -1,3 +1,30 @@
+2011-08-31 Yury Semikhatsky <[email protected]>
+
+ [Chromium] Web Inspector: dedicated worker inspection is broken
+ https://bugs.webkit.org/show_bug.cgi?id=67279
+
+ Provide transport for inspector messages between Page and DedicatedWorker inspectors
+ in case of in-process workers.
+
+ Reviewed by Pavel Feldman.
+
+ * inspector/CodeGeneratorInspector.pm: sendMessageObjectToBackend should accept message
+ object which is ready for sending to backend. This method is overriden in WorkerManager
+ for dedicated workers and we don't want to replicate request id assignment there.
+ * workers/WorkerMessagingProxy.cpp:
+ (WebCore::PostMessageToPageInspectorTask::create):
+ (WebCore::PostMessageToPageInspectorTask::PostMessageToPageInspectorTask):
+ (WebCore::PostMessageToPageInspectorTask::performTask):
+ (WebCore::WorkerMessagingProxy::WorkerMessagingProxy):
+ (WebCore::connectToWorkerContextInspectorTask):
+ (WebCore::WorkerMessagingProxy::connectToInspector):
+ (WebCore::disconnectFromWorkerContextInspectorTask):
+ (WebCore::WorkerMessagingProxy::disconnectFromInspector):
+ (WebCore::dispatchOnInspectorBackendTask):
+ (WebCore::WorkerMessagingProxy::sendMessageToInspector):
+ (WebCore::WorkerMessagingProxy::postMessageToPageInspector):
+ * workers/WorkerMessagingProxy.h:
+
2011-09-01 Csaba Osztrogonác <[email protected]>
[CSS3 Backgrounds and Borders] Implement border-image-slice
Modified: trunk/Source/WebCore/bindings/js/WorkerScriptDebugServer.cpp (94305 => 94306)
--- trunk/Source/WebCore/bindings/js/WorkerScriptDebugServer.cpp 2011-09-01 17:25:41 UTC (rev 94305)
+++ trunk/Source/WebCore/bindings/js/WorkerScriptDebugServer.cpp 2011-09-01 17:36:12 UTC (rev 94306)
@@ -38,6 +38,8 @@
namespace WebCore {
+const char* WorkerScriptDebugServer::debuggerTaskMode = "debugger";
+
WorkerScriptDebugServer::WorkerScriptDebugServer()
: ScriptDebugServer()
{
Modified: trunk/Source/WebCore/bindings/js/WorkerScriptDebugServer.h (94305 => 94306)
--- trunk/Source/WebCore/bindings/js/WorkerScriptDebugServer.h 2011-09-01 17:25:41 UTC (rev 94305)
+++ trunk/Source/WebCore/bindings/js/WorkerScriptDebugServer.h 2011-09-01 17:36:12 UTC (rev 94306)
@@ -48,6 +48,8 @@
void addListener(ScriptDebugListener*, WorkerContext*);
void removeListener(ScriptDebugListener*, WorkerContext*);
+ static const char* debuggerTaskMode;
+
private:
virtual void recompileAllJSFunctions(Timer<ScriptDebugServer>*) { }
virtual ListenerSet* getListenersForGlobalObject(JSC::JSGlobalObject*) { return 0; }
Modified: trunk/Source/WebCore/inspector/CodeGeneratorInspector.pm (94305 => 94306)
--- trunk/Source/WebCore/inspector/CodeGeneratorInspector.pm 2011-09-01 17:25:41 UTC (rev 94305)
+++ trunk/Source/WebCore/inspector/CodeGeneratorInspector.pm 2011-09-01 17:36:12 UTC (rev 94306)
@@ -789,7 +789,7 @@
var agentName = domainAndFunction[0] + "Agent";
if (!window[agentName])
window[agentName] = {};
- window[agentName][domainAndFunction[1]] = this.sendMessageToBackend.bind(this, requestString);
+ window[agentName][domainAndFunction[1]] = this._sendMessageToBackend.bind(this, requestString);
window[agentName][domainAndFunction[1]]["invoke"] = this._invoke.bind(this, requestString)
},
@@ -797,10 +797,10 @@
{
var request = JSON.parse(requestString);
request.params = args;
- this.sendMessageObjectToBackend(request, callback);
+ this._wrapCallbackAndSendMessageObject(request, callback);
},
- sendMessageToBackend: function()
+ _sendMessageToBackend: function()
{
var args = Array.prototype.slice.call(arguments);
var request = JSON.parse(args.shift());
@@ -844,17 +844,23 @@
}
}
- this.sendMessageObjectToBackend(request, callback);
+ this._wrapCallbackAndSendMessageObject(request, callback);
},
- sendMessageObjectToBackend: function(messageObject, callback)
+ _wrapCallbackAndSendMessageObject: function(messageObject, callback)
{
messageObject.id = this._wrap(callback || function() {});
- var message = JSON.stringify(messageObject);
+
if (window.dumpInspectorProtocolMessages)
- console.log("frontend: " + message);
+ console.log("frontend: " + JSON.stringify(messageObject));
++this._pendingResponsesCount;
+ this.sendMessageObjectToBackend(messageObject);
+ },
+
+ sendMessageObjectToBackend: function(messageObject)
+ {
+ var message = JSON.stringify(messageObject);
InspectorFrontendHost.sendMessageToBackend(message);
},
Modified: trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp (94305 => 94306)
--- trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp 2011-09-01 17:25:41 UTC (rev 94305)
+++ trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp 2011-09-01 17:36:12 UTC (rev 94306)
@@ -43,6 +43,8 @@
#include "ScriptCallStack.h"
#include "ScriptExecutionContext.h"
#include "Worker.h"
+#include "WorkerInspectorController.h"
+#include "WorkerScriptDebugServer.h"
#include <wtf/MainThread.h>
namespace WebCore {
@@ -209,7 +211,31 @@
bool m_hasPendingActivity;
};
+class PostMessageToPageInspectorTask : public ScriptExecutionContext::Task {
+public:
+ static PassOwnPtr<PostMessageToPageInspectorTask> create(WorkerMessagingProxy* messagingProxy, const String& message)
+ {
+ return adoptPtr(new PostMessageToPageInspectorTask(messagingProxy, message));
+ }
+private:
+ PostMessageToPageInspectorTask(WorkerMessagingProxy* messagingProxy, const String& message)
+ : m_messagingProxy(messagingProxy)
+ , m_message(message.crossThreadString())
+ {
+ }
+
+ virtual void performTask(ScriptExecutionContext*)
+ {
+ if (WorkerContextProxy::PageInspector* pageInspector = m_messagingProxy->m_pageInspector)
+ pageInspector->dispatchMessageFromWorker(m_message);
+ }
+
+ WorkerMessagingProxy* m_messagingProxy;
+ String m_message;
+};
+
+
#if !PLATFORM(CHROMIUM)
WorkerContextProxy* WorkerContextProxy::create(Worker* worker)
{
@@ -223,6 +249,9 @@
, m_unconfirmedMessageCount(0)
, m_workerThreadHadPendingActivity(false)
, m_askedToTerminate(false)
+#if ENABLE(INSPECTOR)
+ , m_pageInspector(0)
+#endif
{
ASSERT(m_workerObject);
ASSERT((m_scriptExecutionContext->isDocument() && isMainThread())
@@ -323,6 +352,50 @@
workerContextDestroyedInternal();
}
+#if ENABLE(INSPECTOR)
+static void connectToWorkerContextInspectorTask(ScriptExecutionContext* context, bool)
+{
+ ASSERT(context->isWorkerContext());
+ static_cast<WorkerContext*>(context)->workerInspectorController()->connectFrontend();
+}
+
+void WorkerMessagingProxy::connectToInspector(WorkerContextProxy::PageInspector* pageInspector)
+{
+ if (m_askedToTerminate)
+ return;
+ ASSERT(!m_pageInspector);
+ m_pageInspector = pageInspector;
+ m_workerThread->runLoop().postTask(createCallbackTask(connectToWorkerContextInspectorTask, true));
+}
+
+static void disconnectFromWorkerContextInspectorTask(ScriptExecutionContext* context, bool)
+{
+ ASSERT(context->isWorkerContext());
+ static_cast<WorkerContext*>(context)->workerInspectorController()->disconnectFrontend();
+}
+
+void WorkerMessagingProxy::disconnectFromInspector()
+{
+ m_pageInspector = 0;
+ if (m_askedToTerminate)
+ return;
+ m_workerThread->runLoop().postTaskForMode(createCallbackTask(disconnectFromWorkerContextInspectorTask, true), WorkerScriptDebugServer::debuggerTaskMode);
+}
+
+static void dispatchOnInspectorBackendTask(ScriptExecutionContext* context, const String& message)
+{
+ ASSERT(context->isWorkerContext());
+ static_cast<WorkerContext*>(context)->workerInspectorController()->dispatchMessageFromFrontend(message);
+}
+
+void WorkerMessagingProxy::sendMessageToInspector(const String& message)
+{
+ if (m_askedToTerminate)
+ return;
+ m_workerThread->runLoop().postTaskForMode(createCallbackTask(dispatchOnInspectorBackendTask, String(message)), WorkerScriptDebugServer::debuggerTaskMode);
+}
+#endif
+
void WorkerMessagingProxy::workerContextDestroyed()
{
m_scriptExecutionContext->postTask(WorkerContextDestroyedTask::create(this));
@@ -361,8 +434,9 @@
}
#if ENABLE(INSPECTOR)
-void WorkerMessagingProxy::postMessageToPageInspector(const String&)
+void WorkerMessagingProxy::postMessageToPageInspector(const String& message)
{
+ m_scriptExecutionContext->postTask(PostMessageToPageInspectorTask::create(this, message));
}
#endif
Modified: trunk/Source/WebCore/workers/WorkerMessagingProxy.h (94305 => 94306)
--- trunk/Source/WebCore/workers/WorkerMessagingProxy.h 2011-09-01 17:25:41 UTC (rev 94305)
+++ trunk/Source/WebCore/workers/WorkerMessagingProxy.h 2011-09-01 17:36:12 UTC (rev 94306)
@@ -58,6 +58,11 @@
virtual void postMessageToWorkerContext(PassRefPtr<SerializedScriptValue>, PassOwnPtr<MessagePortChannelArray>);
virtual bool hasPendingActivity() const;
virtual void workerObjectDestroyed();
+#if ENABLE(INSPECTOR)
+ virtual void connectToInspector(WorkerContextProxy::PageInspector*);
+ virtual void disconnectFromInspector();
+ virtual void sendMessageToInspector(const String&);
+#endif
// Implementations of WorkerObjectProxy.
// (Only use these methods in the worker context thread.)
@@ -85,6 +90,7 @@
private:
friend class MessageWorkerTask;
+ friend class PostMessageToPageInspectorTask;
friend class WorkerContextDestroyedTask;
friend class WorkerExceptionTask;
friend class WorkerThreadActivityReportTask;
@@ -105,6 +111,9 @@
bool m_askedToTerminate;
Vector<OwnPtr<ScriptExecutionContext::Task> > m_queuedEarlyTasks; // Tasks are queued here until there's a thread object created.
+#if ENABLE(INSPECTOR)
+ WorkerContextProxy::PageInspector* m_pageInspector;
+#endif
};
} // namespace WebCore