Diff
Modified: trunk/Source/WebCore/ChangeLog (87802 => 87803)
--- trunk/Source/WebCore/ChangeLog 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/ChangeLog 2011-06-01 14:34:11 UTC (rev 87803)
@@ -1,3 +1,54 @@
+2011-06-01 Yury Semikhatsky <[email protected]>
+
+ Reviewed by Pavel Feldman.
+
+ Web Inspector: allow opening inspector for existing workers
+ https://bugs.webkit.org/show_bug.cgi?id=61853
+
+ Added sidebar pane with a list of all workers. Each worker has a check box
+ that allows opening inspector for the worker.
+
+ * inspector/Inspector.json:
+ * inspector/InspectorInstrumentation.cpp:
+ (WebCore::InspectorInstrumentation::didStartWorkerContextImpl):
+ * inspector/InspectorInstrumentation.h:
+ (WebCore::InspectorInstrumentation::didStartWorkerContext):
+ * inspector/InspectorWorkerAgent.cpp:
+ (WebCore::InspectorWorkerAgent::WorkerFrontendChannel::WorkerFrontendChannel):
+ (WebCore::InspectorWorkerAgent::WorkerFrontendChannel::~WorkerFrontendChannel):
+ (WebCore::InspectorWorkerAgent::WorkerFrontendChannel::connectToWorkerContext):
+ (WebCore::InspectorWorkerAgent::WorkerFrontendChannel::disconnectFromWorkerContext):
+ (WebCore::InspectorWorkerAgent::clearFrontend):
+ (WebCore::InspectorWorkerAgent::connectToWorker):
+ (WebCore::InspectorWorkerAgent::disconnectFromWorker):
+ (WebCore::InspectorWorkerAgent::didStartWorkerContext):
+ * inspector/InspectorWorkerAgent.h:
+ * inspector/front-end/ScriptsPanel.js:
+ (WebInspector.ScriptsPanel):
+ * inspector/front-end/Settings.js:
+ * inspector/front-end/WorkerManager.js:
+ (WebInspector.WorkerManager):
+ (WebInspector.WorkerManager.prototype._workerCreated):
+ (WebInspector.WorkerManager.prototype._sendMessageToWorkerInspector):
+ (WebInspector.WorkerManager.prototype.openWorkerInspector):
+ (WebInspector.WorkerManager.prototype.closeWorkerInspector):
+ (WebInspector.WorkerManager.prototype._workerInspectorClosing):
+ (WebInspector.WorkerMessageForwarder):
+ (WebInspector.WorkerMessageForwarder.prototype.workerCreated):
+ (WebInspector.WorkerMessageForwarder.prototype.dispatchMessageFromWorker):
+ * inspector/front-end/WorkersSidebarPane.js:
+ (WebInspector.WorkersSidebarPane):
+ (WebInspector.WorkersSidebarPane.prototype.addWorker):
+ (WebInspector.WorkerListSidebarPane):
+ (WebInspector.WorkerListSidebarPane.prototype._workerAdded):
+ (WebInspector.WorkerListSidebarPane.prototype._workerRemoved):
+ (WebInspector.WorkerListSidebarPane.prototype._workerInspectorClosed):
+ (WebInspector.WorkerListSidebarPane.prototype._addWorker):
+ (WebInspector.WorkerListSidebarPane.prototype._createCheckbox):
+ (WebInspector.WorkerListSidebarPane.prototype._workerItemClicked):
+ * workers/Worker.cpp:
+ (WebCore::Worker::notifyFinished):
+
2011-06-01 Shishir Agrawal <[email protected]>
Reviewed by Tony Gentilcore.
Modified: trunk/Source/WebCore/inspector/Inspector.json (87802 => 87803)
--- trunk/Source/WebCore/inspector/Inspector.json 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/inspector/Inspector.json 2011-06-01 14:34:11 UTC (rev 87803)
@@ -1726,13 +1726,26 @@
{ "name": "workerId", "type": "integer" },
{ "name": "message", "type": "object" }
]
+ },
+ {
+ "name": "connectToWorker",
+ "parameters": [
+ { "name": "workerId", "type": "integer" }
+ ]
+ },
+ {
+ "name": "disconnectFromWorker",
+ "parameters": [
+ { "name": "workerId", "type": "integer" }
+ ]
}
],
"events": [
{
"name": "workerCreated",
"parameters": [
- { "name": "workerId", "type": "integer" }
+ { "name": "workerId", "type": "integer" },
+ { "name": "url", "type": "string" }
]
},
{
Modified: trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp (87802 => 87803)
--- trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp 2011-06-01 14:34:11 UTC (rev 87803)
@@ -716,10 +716,10 @@
#endif
#if ENABLE(WORKERS)
-void InspectorInstrumentation::didStartWorkerContextImpl(InstrumentingAgents* instrumentingAgents, WorkerContextProxy* workerContextProxy)
+void InspectorInstrumentation::didStartWorkerContextImpl(InstrumentingAgents* instrumentingAgents, WorkerContextProxy* workerContextProxy, const KURL& url)
{
if (InspectorWorkerAgent* workerAgent = instrumentingAgents->inspectorWorkerAgent())
- workerAgent->didStartWorkerContext(workerContextProxy);
+ workerAgent->didStartWorkerContext(workerContextProxy, url);
}
void InspectorInstrumentation::didCreateWorkerImpl(InstrumentingAgents* instrumentingAgents, intptr_t id, const String& url, bool isSharedWorker)
Modified: trunk/Source/WebCore/inspector/InspectorInstrumentation.h (87802 => 87803)
--- trunk/Source/WebCore/inspector/InspectorInstrumentation.h 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/inspector/InspectorInstrumentation.h 2011-06-01 14:34:11 UTC (rev 87803)
@@ -161,7 +161,7 @@
#if ENABLE(WORKERS)
static bool willStartWorkerContext(ScriptExecutionContext*, WorkerContextProxy*);
- static void didStartWorkerContext(ScriptExecutionContext*, WorkerContextProxy*, bool paused);
+ static void didStartWorkerContext(ScriptExecutionContext*, WorkerContextProxy*, bool paused, const KURL&);
static void didCreateWorker(ScriptExecutionContext*, intptr_t id, const String& url, bool isSharedWorker);
static void didDestroyWorker(ScriptExecutionContext*, intptr_t id);
#endif
@@ -283,7 +283,7 @@
#endif
#if ENABLE(WORKERS)
- static void didStartWorkerContextImpl(InstrumentingAgents*, WorkerContextProxy*);
+ static void didStartWorkerContextImpl(InstrumentingAgents*, WorkerContextProxy*, const KURL&);
static void didCreateWorkerImpl(InstrumentingAgents*, intptr_t id, const String& url, bool isSharedWorker);
static void didDestroyWorkerImpl(InstrumentingAgents*, intptr_t id);
#endif
@@ -856,14 +856,14 @@
return false;
}
-inline void InspectorInstrumentation::didStartWorkerContext(ScriptExecutionContext* context, WorkerContextProxy* proxy, bool paused)
+inline void InspectorInstrumentation::didStartWorkerContext(ScriptExecutionContext* context, WorkerContextProxy* proxy, bool paused, const KURL& url)
{
#if ENABLE(INSPECTOR)
if (!paused)
return;
FAST_RETURN_IF_NO_FRONTENDS(void());
if (InstrumentingAgents* instrumentingAgents = instrumentingAgentsForContext(context))
- didStartWorkerContextImpl(instrumentingAgents, proxy);
+ didStartWorkerContextImpl(instrumentingAgents, proxy, url);
#endif
}
Modified: trunk/Source/WebCore/inspector/InspectorWorkerAgent.cpp (87802 => 87803)
--- trunk/Source/WebCore/inspector/InspectorWorkerAgent.cpp 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/inspector/InspectorWorkerAgent.cpp 2011-06-01 14:34:11 UTC (rev 87803)
@@ -38,6 +38,7 @@
#include "InspectorFrontendChannel.h"
#include "InspectorValues.h"
#include "InstrumentingAgents.h"
+#include "KURL.h"
#include "WorkerContextProxy.h"
#include <wtf/PassOwnPtr.h>
#include <wtf/RefPtr.h>
@@ -50,13 +51,33 @@
: m_frontend(frontend)
, m_proxy(proxy)
, m_id(s_nextId++)
+ , m_connected(false)
{
}
- virtual ~WorkerFrontendChannel() { }
+ virtual ~WorkerFrontendChannel()
+ {
+ disconnectFromWorkerContext();
+ }
int id() const { return m_id; }
WorkerContextProxy* proxy() const { return m_proxy; }
+ void connectToWorkerContext()
+ {
+ if (m_connected)
+ return;
+ m_connected = true;
+ m_proxy->connectToInspector(this);
+ }
+
+ void disconnectFromWorkerContext()
+ {
+ if (!m_connected)
+ return;
+ m_connected = false;
+ m_proxy->disconnectFromInspector();
+ }
+
private:
// WorkerContextProxy::PageInspector implementation
virtual void dispatchMessageFromWorker(const String& message)
@@ -73,6 +94,7 @@
InspectorFrontend* m_frontend;
WorkerContextProxy* m_proxy;
int m_id;
+ bool m_connected;
static int s_nextId;
};
@@ -104,8 +126,28 @@
{
m_inspectorFrontend = 0;
m_instrumentingAgents->setInspectorWorkerAgent(0);
+ deleteAllValues(m_idToChannel);
+ m_idToChannel.clear();
}
+void InspectorWorkerAgent::connectToWorker(ErrorString* error, int workerId)
+{
+ WorkerFrontendChannel* channel = m_idToChannel.get(workerId);
+ if (channel)
+ channel->connectToWorkerContext();
+ else
+ *error = "Worker is gone";
+}
+
+void InspectorWorkerAgent::disconnectFromWorker(ErrorString* error, int workerId)
+{
+ WorkerFrontendChannel* channel = m_idToChannel.get(workerId);
+ if (channel)
+ channel->disconnectFromWorkerContext();
+ else
+ *error = "Worker is gone";
+}
+
void InspectorWorkerAgent::sendMessageToWorker(ErrorString* error, int workerId, PassRefPtr<InspectorObject> message)
{
WorkerFrontendChannel* channel = m_idToChannel.get(workerId);
@@ -115,14 +157,13 @@
*error = "Worker is gone";
}
-void InspectorWorkerAgent::didStartWorkerContext(WorkerContextProxy* workerContextProxy)
+void InspectorWorkerAgent::didStartWorkerContext(WorkerContextProxy* workerContextProxy, const KURL& url)
{
WorkerFrontendChannel* channel = new WorkerFrontendChannel(m_inspectorFrontend, workerContextProxy);
m_idToChannel.set(channel->id(), channel);
- workerContextProxy->connectToInspector(channel);
- if (m_inspectorFrontend)
- m_inspectorFrontend->worker()->workerCreated(channel->id());
+ ASSERT(m_inspectorFrontend);
+ m_inspectorFrontend->worker()->workerCreated(channel->id(), url.string());
}
} // namespace WebCore
Modified: trunk/Source/WebCore/inspector/InspectorWorkerAgent.h (87802 => 87803)
--- trunk/Source/WebCore/inspector/InspectorWorkerAgent.h 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/inspector/InspectorWorkerAgent.h 2011-06-01 14:34:11 UTC (rev 87803)
@@ -40,6 +40,7 @@
class InspectorFrontend;
class InspectorObject;
class InstrumentingAgents;
+class KURL;
class WorkerContextProxy;
typedef String ErrorString;
@@ -53,9 +54,11 @@
void clearFrontend();
// Called from InspectorInstrumentation
- void didStartWorkerContext(WorkerContextProxy*);
+ void didStartWorkerContext(WorkerContextProxy*, const KURL&);
// Called from InspectorBackendDispatcher
+ void connectToWorker(ErrorString*, int workerId);
+ void disconnectFromWorker(ErrorString*, int workerId);
void sendMessageToWorker(ErrorString*, int workerId, PassRefPtr<InspectorObject> message);
private:
Modified: trunk/Source/WebCore/inspector/front-end/ScriptsPanel.js (87802 => 87803)
--- trunk/Source/WebCore/inspector/front-end/ScriptsPanel.js 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/inspector/front-end/ScriptsPanel.js 2011-06-01 14:34:11 UTC (rev 87803)
@@ -107,7 +107,10 @@
}
this.sidebarPanes.workers = new WebInspector.WorkersSidebarPane();
+ if (Preferences.canInspectWorkers && WebInspector.workerManager)
+ this.sidebarPanes.workerList = new WebInspector.WorkerListSidebarPane(WebInspector.workerManager);
+
for (var pane in this.sidebarPanes)
this.sidebarElement.appendChild(this.sidebarPanes[pane].element);
Modified: trunk/Source/WebCore/inspector/front-end/Settings.js (87802 => 87803)
--- trunk/Source/WebCore/inspector/front-end/Settings.js 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/inspector/front-end/Settings.js 2011-06-01 14:34:11 UTC (rev 87803)
@@ -51,7 +51,8 @@
heapProfilerPresent: false,
detailedHeapProfiles: false,
saveAsAvailable: false,
- useLowerCaseMenuTitlesOnWindows: false
+ useLowerCaseMenuTitlesOnWindows: false,
+ canInspectWorkers: false,
}
WebInspector.Settings = function()
Modified: trunk/Source/WebCore/inspector/front-end/WorkerManager.js (87802 => 87803)
--- trunk/Source/WebCore/inspector/front-end/WorkerManager.js 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/inspector/front-end/WorkerManager.js 2011-06-01 14:34:11 UTC (rev 87803)
@@ -30,6 +30,8 @@
WebInspector.WorkerManager = function()
{
+ this._workerIdToWindow = {};
+ InspectorBackend.registerDomainDispatcher("Worker", new WebInspector.WorkerMessageForwarder(this));
}
WebInspector.WorkerManager.isWorkerFrontend = function()
@@ -41,11 +43,10 @@
{
var workerId = WebInspector.queryParamsObject["workerId"];
if (!workerId) {
- InspectorBackend.registerDomainDispatcher("Worker", new WebInspector.WorkerMessageForwarder());
+ WebInspector.workerManager = new WebInspector.WorkerManager();
return;
}
-
function receiveMessage(event)
{
var message = event.data;
@@ -65,11 +66,56 @@
}
}
+WebInspector.WorkerManager.Events = {
+ WorkerAdded: "worker-added",
+ WorkerRemoved: "worker-removed",
+ WorkerInspectorClosed: "worker-inspector-closed"
+}
-WebInspector.WorkerMessageForwarder = function()
+WebInspector.WorkerManager.prototype = {
+ _workerCreated: function(workerId, url)
+ {
+ this.dispatchEventToListeners(WebInspector.WorkerManager.Events.WorkerAdded, {workerId: workerId, url: url});
+ },
+
+ _sendMessageToWorkerInspector: function(workerId, message)
+ {
+ var workerInspectorWindow = this._workerIdToWindow[workerId];
+ if (workerInspectorWindow)
+ workerInspectorWindow.postMessage(message, "*");
+ },
+
+ openWorkerInspector: function(workerId)
+ {
+ var url = "" + "&workerId=" + workerId;
+ url = "" "");
+ var workerInspectorWindow = window.open(url);
+ this._workerIdToWindow[workerId] = workerInspectorWindow;
+ workerInspectorWindow.addEventListener("beforeunload", this._workerInspectorClosing.bind(this, workerId), true);
+ WorkerAgent.connectToWorker(workerId);
+ },
+
+ closeWorkerInspector: function(workerId)
+ {
+ var workerInspectorWindow = this._workerIdToWindow[workerId];
+ if (workerInspectorWindow)
+ workerInspectorWindow.close();
+ },
+
+ _workerInspectorClosing: function(workerId, event)
+ {
+ delete this._workerIdToWindow[workerId];
+ WorkerAgent.disconnectFromWorker(workerId);
+ this.dispatchEventToListeners(WebInspector.WorkerManager.Events.WorkerInspectorClosed, workerId);
+ }
+}
+
+WebInspector.WorkerManager.prototype.__proto__ = WebInspector.Object.prototype;
+
+WebInspector.WorkerMessageForwarder = function(workerManager)
{
+ this._workerManager = workerManager;
window.addEventListener("message", this._receiveMessage.bind(this), true);
- this._workerIdToWindow = {};
}
WebInspector.WorkerMessageForwarder.prototype = {
@@ -84,17 +130,13 @@
WorkerAgent.sendMessageToWorker(workerId, message);
},
- workerCreated: function(workerId)
+ workerCreated: function(workerId, url)
{
- var url = "" + "&workerId=" + workerId;
- url = "" "");
- this._workerIdToWindow[workerId] = window.open(url);
+ this._workerManager._workerCreated(workerId, url);
},
dispatchMessageFromWorker: function(workerId, message)
{
- var win = this._workerIdToWindow[workerId];
- if (win)
- win.postMessage(message, "*");
+ this._workerManager._sendMessageToWorkerInspector(workerId, message);
}
}
Modified: trunk/Source/WebCore/inspector/front-end/WorkersSidebarPane.js (87802 => 87803)
--- trunk/Source/WebCore/inspector/front-end/WorkersSidebarPane.js 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/inspector/front-end/WorkersSidebarPane.js 2011-06-01 14:34:11 UTC (rev 87803)
@@ -31,7 +31,7 @@
WebInspector.WorkersSidebarPane = function()
{
WebInspector.SidebarPane.call(this, WebInspector.UIString("Workers"));
-
+
this._workers = {};
this._enableWorkersCheckbox = new WebInspector.Checkbox(
@@ -53,7 +53,7 @@
WebInspector.WorkersSidebarPane.prototype = {
addWorker: function(id, url, isShared)
{
- if (id in this._workers)
+ if (id in this._workers)
return;
var worker = new WebInspector.Worker(id, url, isShared);
this._workers[id] = worker;
@@ -100,3 +100,75 @@
this.url = ""
this.shared = shared;
}
+
+
+
+WebInspector.WorkerListSidebarPane = function(workerManager)
+{
+ WebInspector.SidebarPane.call(this, WebInspector.UIString("Worker inspectors"));
+
+ this._workerListElement = document.createElement("ol");
+ this._workerListElement.tabIndex = 0;
+ this._workerListElement.addStyleClass("properties-tree");
+ this._workerListTreeOutline = new TreeOutline(this._workerListElement);
+ this.bodyElement.appendChild(this._workerListElement);
+
+ this._idToWorkerItem = {};
+ this._workerManager = workerManager;
+
+ workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerAdded, this._workerAdded, this);
+ workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerRemoved, this._workerRemoved, this);
+ workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerInspectorClosed, this._workerInspectorClosed, this);
+}
+
+WebInspector.WorkerListSidebarPane.prototype = {
+ _workerAdded: function(event)
+ {
+ this._addWorker(event.data.workerId, event.data.url);
+ },
+
+ _workerRemoved: function(event)
+ {
+ var workerItem = this._idToWorkerItem[event.data];
+ workerItem.element.parentElement.removeChild(workerItem.element);
+ },
+
+ _workerInspectorClosed: function(event)
+ {
+ var workerItem = this._idToWorkerItem[event.data];
+ workerItem.checkbox.checked = false;
+ },
+
+ _addWorker: function(workerId, url)
+ {
+ var workerItem = {};
+ workerItem.workerId = workerId;
+ workerItem.element = new TreeElement(url);
+ this._workerListTreeOutline.appendChild(workerItem.element);
+ workerItem.element.selectable = true;
+
+ workerItem.checkbox = this._createCheckbox(workerItem.element);
+ workerItem.checkbox.addEventListener("click", this._workerItemClicked.bind(this, workerItem), true);
+
+ this._idToWorkerItem[workerId] = workerItem;
+ },
+
+ _createCheckbox: function(treeElement)
+ {
+ var checkbox = document.createElement("input");
+ checkbox.className = "checkbox-elem";
+ checkbox.type = "checkbox";
+ treeElement.listItemElement.insertBefore(checkbox, treeElement.listItemElement.firstChild);
+ return checkbox;
+ },
+
+ _workerItemClicked: function(workerItem, event)
+ {
+ if (event.target.checked)
+ this._workerManager.openWorkerInspector(workerItem.workerId);
+ else
+ this._workerManager.closeWorkerInspector(workerItem.workerId);
+ }
+}
+
+WebInspector.WorkerListSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
Modified: trunk/Source/WebCore/workers/Worker.cpp (87802 => 87803)
--- trunk/Source/WebCore/workers/Worker.cpp 2011-06-01 14:11:23 UTC (rev 87802)
+++ trunk/Source/WebCore/workers/Worker.cpp 2011-06-01 14:34:11 UTC (rev 87803)
@@ -133,7 +133,7 @@
else {
bool shouldStartPaused = InspectorInstrumentation::willStartWorkerContext(scriptExecutionContext(), m_contextProxy);
m_contextProxy->startWorkerContext(m_scriptLoader->url(), scriptExecutionContext()->userAgent(m_scriptLoader->url()), m_scriptLoader->script());
- InspectorInstrumentation::didStartWorkerContext(scriptExecutionContext(), m_contextProxy, shouldStartPaused);
+ InspectorInstrumentation::didStartWorkerContext(scriptExecutionContext(), m_contextProxy, shouldStartPaused, m_scriptLoader->url());
InspectorInstrumentation::scriptImported(scriptExecutionContext(), m_scriptLoader->identifier(), m_scriptLoader->script());
}
m_scriptLoader = nullptr;