No subject


Tue May 3 15:05:30 PDT 2016


like a special JavaScript context, separate from the page, that
may have its own set of Agents. This patch adds the necessary
backend infrastructure to provide WorkerGlobalObject with an
InspectorController and the means to communicate with a frontend
through a Page's WorkerAgent.

Pages now get a WorkerAgent. This informs the frontend about
created and terminated Workers. It also provides a communication
channel to dispatch and return inspector protocol messages to
each of the Workers. The Page side always interacts with the
WorkerInspectorProxy on the main thread. The Page's Worker Agent
can sends and receives messages to WorkerInspectorControllers.

WorkerGlobalScopes now get a WorkerInspectorController which
will eventually contain its own set of agents. There are no
agents yet, but they will be added individually in follow-up
patches. The Worker side always interacts with the
WorkerGlobalScope on the worker thread. WorkerInspectorController
dispatches messages on its agents.

All communication with Worker agents goes through Worker.sendMessageToWorker,
which tunnels the command request to the Worker's InspectorController
and agents. At the protocol level, worker agent command responses and
worker agent events are sent as events through Worker.dispatchMessageFromWorker.
On the frontend, the message dispatcher code will pair up replies with
their commands, and no-reply messages as events, like normal. So calling
worker agent methods in the frontend will be no different from the
existing callback/promise-based ways.

* CMakeLists.txt:
* WebCore.xcodeproj/project.pbxproj:
* inspector/InspectorAllInOne.cpp:
Add new files.

* bindings/js/WorkerScriptController.cpp:
(WebCore::WorkerScriptController::WorkerScriptController):
(WebCore::WorkerScriptController::initScript):
* bindings/js/WorkerScriptController.h:
Some cleanup.

* inspector/InspectorController.cpp:
(WebCore::InspectorController::InspectorController):
* inspector/InspectorController.h:
* inspector/InstrumentingAgents.cpp:
(WebCore::InstrumentingAgents::reset):
* inspector/InstrumentingAgents.h:
(WebCore::InstrumentingAgents::inspectorWorkerAgent):
(WebCore::InstrumentingAgents::setInspectorWorkerAgent):
* inspector/InspectorInstrumentation.cpp:
(WebCore::InspectorInstrumentation::workerStartedImpl):
(WebCore::InspectorInstrumentation::workerTerminatedImpl):
(WebCore::InspectorInstrumentation::instrumentingAgentsForWorkerGlobalScope):
* inspector/InspectorInstrumentation.h:
(WebCore::InspectorInstrumentation::workerStarted):
(WebCore::InspectorInstrumentation::workerTerminated):
(WebCore::InspectorInstrumentation::instrumentingAgentsForContext):
Give the Page a WorkerAgent and Instrumentation methods for
Worker creation and termination.

* inspector/InspectorWorkerAgent.h: Added.
* inspector/InspectorWorkerAgent.cpp: Added.
(WebCore::InspectorWorkerAgent::InspectorWorkerAgent):
(WebCore::InspectorWorkerAgent::didCreateFrontendAndBackend):
(WebCore::InspectorWorkerAgent::willDestroyFrontendAndBackend):
(WebCore::InspectorWorkerAgent::enable):
(WebCore::InspectorWorkerAgent::disable):
(WebCore::InspectorWorkerAgent::workerStarted):
(WebCore::InspectorWorkerAgent::workerTerminated):
(WebCore::InspectorWorkerAgent::connectToAllWorkerInspectorProxiesForPage):
(WebCore::InspectorWorkerAgent::disconnectFromAllWorkerInspectorProxies):
(WebCore::InspectorWorkerAgent::connectToWorkerInspectorProxy):
(WebCore::InspectorWorkerAgent::disconnectFromWorkerInspectorProxy):
Handle connecting to Workers. This performs the "connectFrontend"
and "disconnectFrontend" dance with each Worker's InspectorController.
We only connect to workers when the Worker domain is enabled.

(WebCore::InspectorWorkerAgent::sendMessageToWorker):
(WebCore::InspectorWorkerAgent::sendMessageFromWorkerToFrontend):
Proxying messages to individual messages happens through the
WorkerInspectorProxy. That takes care of passing messages
across threads for us.

* workers/WorkerInspectorProxy.cpp: Added.
(WebCore::WorkerInspectorProxy::allWorkerInspectorProxies):
(WebCore::WorkerInspectorProxy::WorkerInspectorProxy):
(WebCore::WorkerInspectorProxy::~WorkerInspectorProxy):
(WebCore::WorkerInspectorProxy::workerStarted):
(WebCore::WorkerInspectorProxy::workerTerminated):
(WebCore::WorkerInspectorProxy::connectToWorkerInspector):
(WebCore::WorkerInspectorProxy::disconnectFromWorkerInspector):
(WebCore::WorkerInspectorProxy::sendMessageToWorkerInspector):
(WebCore::WorkerInspectorProxy::sendMessageFromWorkerToFrontend):
* workers/WorkerInspectorProxy.h: Added.
(WebCore::WorkerInspectorProxy::PageChannel::~PageChannel):
(WebCore::WorkerInspectorProxy::url):
(WebCore::WorkerInspectorProxy::identifier):
(WebCore::WorkerInspectorProxy::scriptExecutionContext):
The WorkerInspectorProxy simplifies the cross thread communication
between the Page Inspector and Worker Inspector. It also provides
a clean interface between the two sides.

* inspector/WorkerToPageFrontendChannel.h: Added.
* inspector/WorkerInspectorController.h: Added.
* inspector/WorkerInspectorController.cpp: Added.
(WebCore::WorkerInspectorController::WorkerInspectorController):
(WebCore::WorkerInspectorController::~WorkerInspectorController):
(WebCore::WorkerInspectorController::workerTerminating):
(WebCore::WorkerInspectorController::connectFrontend):
(WebCore::WorkerInspectorController::disconnectFrontend):
(WebCore::WorkerInspectorController::dispatchMessageFromFrontend):
(WebCore::WorkerInspectorController::functionCallHandler):
(WebCore::WorkerInspectorController::evaluateHandler):
(WebCore::WorkerInspectorController::vm):
A basic InspectorController for a WorkerGlobalScope.
No agents yet, they will come soon.

* inspector/WorkerScriptDebugServer.h:
* inspector/WorkerScriptDebugServer.cpp:
(WebCore::WorkerScriptDebugServer::WorkerScriptDebugServer):
(WebCore::WorkerScriptDebugServer::attachDebugger):
(WebCore::WorkerScriptDebugServer::detachDebugger):
(WebCore::WorkerScriptDebugServer::recompileAllJSFunctions):
(WebCore::WorkerScriptDebugServer::runEventLoopWhilePaused):
(WebCore::WorkerScriptDebugServer::reportException):
(WebCore::WorkerScriptDebugServer::interruptAndRunTask):
A basic WorkerScriptDebug server for a WorkerGlobalScope.
Not really used until we implement DebuggerAgent, but needed for InspectorEnvironment.

* workers/WorkerGlobalScope.cpp:
(WebCore::WorkerGlobalScope::WorkerGlobalScope):
* workers/WorkerGlobalScope.h:
(WebCore::WorkerGlobalScope::inspectorController):
Give the WorkerGlobalScope an InspectorController.

* workers/WorkerThread.cpp:
(WebCore::WorkerThread::stop):
Ensure the Worker InspectorController is immediately on
the WorkerThread when it is about to be closed.

* workers/WorkerMessagingProxy.cpp:
(WebCore::WorkerMessagingProxy::WorkerMessagingProxy):
(WebCore::WorkerMessagingProxy::startWorkerGlobalScope):
(WebCore::WorkerMessagingProxy::postMessageToPageInspector):
(WebCore::WorkerMessagingProxy::workerGlobalScopeDestroyedInternal):
(WebCore::WorkerMessagingProxy::terminateWorkerGlobalScope):
* workers/WorkerMessagingProxy.h:
* workers/WorkerReportingProxy.h:
Call into the WorkerInspectorProxy for any inspector related logic,
such as creation, termination, and messages received from the Worker.

Source/WebInspectorUI:

* UserInterface/Main.html:
* UserInterface/Test.html:
New files.

* UserInterface/Base/Main.js:
(WebInspector.loaded):
* UserInterface/Test/Test.js:
(WebInspector.loaded):
New Observers and Managers.

* UserInterface/Protocol/WorkerObserver.js: Added.
(WebInspector.WorkerObserver.prototype.workerCreated):
(WebInspector.WorkerObserver.prototype.workerTerminated):
(WebInspector.WorkerObserver.prototype.dispatchMessageFromWorker):
(WebInspector.WorkerObserver):
* UserInterface/Controllers/WorkerManager.js: Added.
(WebInspector.WorkerManager):
(WebInspector.WorkerManager.prototype.workerCreated):
(WebInspector.WorkerManager.prototype.workerTerminated):
(WebInspector.WorkerManager.prototype.dispatchMessageFromWorker):
To be implemented with the first Worker agent implementation
when there is actually something we can do with the Worker.

LayoutTests:

* inspector/worker/resources/worker-1.js: Added.
* inspector/worker/resources/worker-2.js: Added.
* inspector/worker/resources/worker-3.js: Added.
* inspector/worker/worker-create-and-terminate-expected.txt: Added.
* inspector/worker/worker-create-and-terminate.html: Added.
Tests for the new Worker domain events.
The rest of the Worker domain will be tested as soon as
we add the first Agent in Workers.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreDerivedSourcesmake">trunk/Source/JavaScriptCore/DerivedSources.make</a></li>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsjsWorkerScriptControllercpp">trunk/Source/WebCore/bindings/js/WorkerScriptController.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsWorkerScriptControllerh">trunk/Source/WebCore/bindings/js/WorkerScriptController.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorAllInOnecpp">trunk/Source/WebCore/inspector/InspectorAllInOne.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorControllercpp">trunk/Source/WebCore/inspector/InspectorController.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorControllerh">trunk/Source/WebCore/inspector/InspectorController.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorInstrumentationcpp">trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorInstrumentationh">trunk/Source/WebCore/inspector/InspectorInstrumentation.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorInstrumentingAgentscpp">trunk/Source/WebCore/inspector/InstrumentingAgents.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInstrumentingAgentsh">trunk/Source/WebCore/inspector/InstrumentingAgents.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerGlobalScopecpp">trunk/Source/WebCore/workers/WorkerGlobalScope.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerGlobalScopeh">trunk/Source/WebCore/workers/WorkerGlobalScope.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerMessagingProxycpp">trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerMessagingProxyh">trunk/Source/WebCore/workers/WorkerMessagingProxy.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerReportingProxyh">trunk/Source/WebCore/workers/WorkerReportingProxy.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerThreadcpp">trunk/Source/WebCore/workers/WorkerThread.cpp</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceBaseMainjs">trunk/Source/WebInspectorUI/UserInterface/Base/Main.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceMainhtml">trunk/Source/WebInspectorUI/UserInterface/Main.html</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceTestTestjs">trunk/Source/WebInspectorUI/UserInterface/Test/Test.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceTesthtml">trunk/Source/WebInspectorUI/UserInterface/Test.html</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>trunk/LayoutTests/inspector/worker/</li>
<li>trunk/LayoutTests/inspector/worker/resources/</li>
<li><a href="#trunkLayoutTestsinspectorworkerresourcesworker1js">trunk/LayoutTests/inspector/worker/resources/worker-1.js</a></li>
<li><a href="#trunkLayoutTestsinspectorworkerresourcesworker2js">trunk/LayoutTests/inspector/worker/resources/worker-2.js</a></li>
<li><a href="#trunkLayoutTestsinspectorworkerresourcesworker3js">trunk/LayoutTests/inspector/worker/resources/worker-3.js</a></li>
<li><a href="#trunkLayoutTestsinspectorworkerworkercreateandterminateexpectedtxt">trunk/LayoutTests/inspector/worker/worker-create-and-terminate-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectorworkerworkercreateandterminatehtml">trunk/LayoutTests/inspector/worker/worker-create-and-terminate.html</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorprotocolWorkerjson">trunk/Source/JavaScriptCore/inspector/protocol/Worker.json</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorWorkerAgentcpp">trunk/Source/WebCore/inspector/InspectorWorkerAgent.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorWorkerAgenth">trunk/Source/WebCore/inspector/InspectorWorkerAgent.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorWorkerInspectorControllercpp">trunk/Source/WebCore/inspector/WorkerInspectorController.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorWorkerInspectorControllerh">trunk/Source/WebCore/inspector/WorkerInspectorController.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorWorkerScriptDebugServercpp">trunk/Source/WebCore/inspector/WorkerScriptDebugServer.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorWorkerScriptDebugServerh">trunk/Source/WebCore/inspector/WorkerScriptDebugServer.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorWorkerToPageFrontendChannelh">trunk/Source/WebCore/inspector/WorkerToPageFrontendChannel.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerInspectorProxycpp">trunk/Source/WebCore/workers/WorkerInspectorProxy.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerInspectorProxyh">trunk/Source/WebCore/workers/WorkerInspectorProxy.h</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersWorkerManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/WorkerManager.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceProtocolWorkerObserverjs">trunk/Source/WebInspectorUI/UserInterface/Protocol/WorkerObserver.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/LayoutTests/ChangeLog	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-10-27  Joseph Pecoraro  &lt;pecoraro at apple.com&gt;
+
+        Web Inspector: Introduce Page WorkerAgent and Worker InspectorController
+        https://bugs.webkit.org/show_bug.cgi?id=163817
+        &lt;rdar://problem/28899063&gt;
+
+        Reviewed by Brian Burg.
+
+        * inspector/worker/resources/worker-1.js: Added.
+        * inspector/worker/resources/worker-2.js: Added.
+        * inspector/worker/resources/worker-3.js: Added.
+        * inspector/worker/worker-create-and-terminate-expected.txt: Added.
+        * inspector/worker/worker-create-and-terminate.html: Added.
+        Tests for the new Worker domain events.
+        The rest of the Worker domain will be tested as soon as
+        we add the first Agent in Workers.
+
</ins><span class="cx"> 2016-10-27  Chris Dumez  &lt;cdumez at apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Sync up all copies of testharnessreport.js
</span></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerresourcesworker1js"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/resources/worker-1.js (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/resources/worker-1.js	                        (rev 0)
+++ trunk/LayoutTests/inspector/worker/resources/worker-1.js	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+onmessage = function(event) {
+    let echo = `Worker 1 Echo: ${event.data}`;
+    postMessage(echo);
+}
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerresourcesworker2js"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/resources/worker-2.js (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/resources/worker-2.js	                        (rev 0)
+++ trunk/LayoutTests/inspector/worker/resources/worker-2.js	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+onmessage = function(event) {
+    let echo = `Worker 2 Echo: ${event.data}`;
+    postMessage(echo);
+}
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerresourcesworker3js"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/resources/worker-3.js (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/resources/worker-3.js	                        (rev 0)
+++ trunk/LayoutTests/inspector/worker/resources/worker-3.js	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+onmessage = function(event) {
+    if (event.data === &quot;close&quot;)
+        close();
+}
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerworkercreateandterminateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/worker-create-and-terminate-expected.txt (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/worker-create-and-terminate-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/inspector/worker/worker-create-and-terminate-expected.txt	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+Tests for Worker.workerCreated and Worker.workerTerminated events.
+
+
+== Running test suite: Worker.CreateAndTerminate
+-- Running test case: Worker.enable
+PASS: Should be informed of two existing Workers.
+Worker - inspector/worker/resources/worker-1.js
+Worker - inspector/worker/resources/worker-2.js
+
+-- Running test case: Worker.workerCreated
+PASS: Worker.workerCreated
+Worker - inspector/worker/resources/worker-1.js
+Worker - inspector/worker/resources/worker-2.js
+Worker - inspector/worker/resources/worker-3.js
+
+-- Running test case: Worker.workerTerminated.Page
+PASS: Worker.workerTerminated
+Worker - inspector/worker/resources/worker-1.js
+Worker - inspector/worker/resources/worker-3.js
+
+-- Running test case: Worker.workerTerminated.Worker
+PASS: Worker.workerTerminated
+Worker - inspector/worker/resources/worker-1.js
+
+-- Running test case: Worker.workerTerminated.GC
+PASS: Worker.workerTerminated
+No Workers
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerworkercreateandterminatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/worker-create-and-terminate.html (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/worker-create-and-terminate.html	                        (rev 0)
+++ trunk/LayoutTests/inspector/worker/worker-create-and-terminate.html	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,158 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../http/tests/inspector/resources/protocol-test.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+let worker1 = new Worker(&quot;resources/worker-1.js&quot;);
+let worker2 = new Worker(&quot;resources/worker-2.js&quot;);
+let worker3 = null;
+
+function createWorker3() {
+    worker3 = new Worker(&quot;resources/worker-3.js&quot;);
+}
+
+function terminateWorker2FromPage() {
+    worker2.terminate();
+}
+
+function terminateWorker3FromWorker() {
+    worker3.postMessage(&quot;close&quot;);
+}
+
+function terminateWorker1ViaCollection() {
+    worker1 = null;
+}
+
+function test()
+{
+    let workers = [];
+
+    function addWorker(workerId, url) {
+        workers.push({workerId, url});
+        workers.sort((a, b) =&gt; a.url.localeCompare(b.url));
+    }
+
+    function removeWorker(workerId) {
+        workers = workers.filter((x) =&gt; x.workerId !== workerId);
+    }
+
+    function dumpWorkers() {
+        for (let {workerId, url} of workers)
+            ProtocolTest.log(&quot;Worker - &quot; + sanitizeURL(url));
+        if (!workers.length)
+            ProtocolTest.log(&quot;No Workers&quot;);
+    }
+
+    function sanitizeURL(url) {
+        return url.replace(/^.*?LayoutTests\//, &quot;&quot;);
+    }
+
+
+    let triggerNextCreate;
+    let triggerNextTerminate;
+
+    function waitForWorkerCreatedEvent(callback) {
+        return new Promise((resolve, reject) =&gt; {
+            triggerNextCreate = resolve;
+        });
+    }
+
+    function waitForWorkerTerminatedEvent(callback) {
+        return new Promise((resolve, reject) =&gt; {
+            triggerNextTerminate = resolve;
+        });
+    }
+
+    InspectorProtocol.eventHandler[&quot;Worker.workerCreated&quot;] = (messageObject) =&gt; {
+        addWorker(messageObject.params.workerId, messageObject.params.url);
+        if (triggerNextCreate)
+            triggerNextCreate();
+    };
+
+    InspectorProtocol.eventHandler[&quot;Worker.workerTerminated&quot;] = (messageObject) =&gt; {
+        removeWorker(messageObject.params.workerId);
+        if (triggerNextTerminate)
+            triggerNextTerminate();
+    };
+
+
+    let suite = ProtocolTest.createAsyncSuite(&quot;Worker.CreateAndTerminate&quot;);
+
+    suite.addTestCase({
+        name: &quot;Worker.enable&quot;,
+        description: &quot;Worker.enable informs the frontend of the two existing Workers&quot;,
+        test(resolve, reject) {
+            InspectorProtocol.awaitCommand({method: &quot;Worker.enable&quot;, params: {}})
+                .then(() =&gt; {
+                    ProtocolTest.expectEqual(workers.length, 2, &quot;Should be informed of two existing Workers.&quot;);
+                    dumpWorkers();
+                    resolve();
+                }).catch(reject);
+        }
+    });
+
+    suite.addTestCase({
+        name: &quot;Worker.workerCreated&quot;,
+        description: &quot;Should receive a Worker.workerCreated event when creating a Worker.&quot;,
+        test(resolve, reject) {
+            ProtocolTest.evaluateInPage(&quot;createWorker3()&quot;);
+            waitForWorkerCreatedEvent()
+                .then(() =&gt; {
+                    ProtocolTest.pass(&quot;Worker.workerCreated&quot;);
+                    dumpWorkers();
+                    resolve();
+                }).catch(reject);
+        }
+    });
+
+    suite.addTestCase({
+        name: &quot;Worker.workerTerminated.Page&quot;,
+        description: &quot;Should receive a Worker.workerTerminated event when terminating a Worker from the Page.&quot;,
+        test(resolve, reject) {
+            ProtocolTest.evaluateInPage(&quot;terminateWorker2FromPage()&quot;);
+            waitForWorkerTerminatedEvent()
+                .then(() =&gt; {
+                    ProtocolTest.pass(&quot;Worker.workerTerminated&quot;);
+                    dumpWorkers();
+                    resolve();
+                }).catch(reject);
+        }
+    });
+
+    suite.addTestCase({
+        name: &quot;Worker.workerTerminated.Worker&quot;,
+        description: &quot;Should receive a Worker.workerTerminated event when terminating a Worker from the Worker.&quot;,
+        test(resolve, reject) {
+            ProtocolTest.evaluateInPage(&quot;terminateWorker3FromWorker()&quot;);
+            waitForWorkerTerminatedEvent()
+                .then(() =&gt; {
+                    ProtocolTest.pass(&quot;Worker.workerTerminated&quot;);
+                    dumpWorkers();
+                    resolve();
+                }).catch(reject);
+        }
+    });
+
+    suite.addTestCase({
+        name: &quot;Worker.workerTerminated.GC&quot;,
+        description: &quot;Should receive a Worker.workerTerminated event when terminating a Worker via Garbage Collection.&quot;,
+        test(resolve, reject) {
+            ProtocolTest.evaluateInPage(&quot;terminateWorker1ViaCollection()&quot;);
+            InspectorProtocol.sendCommand(&quot;Heap.gc&quot;, {});
+            waitForWorkerTerminatedEvent()
+                .then(() =&gt; {
+                    ProtocolTest.pass(&quot;Worker.workerTerminated&quot;);
+                    dumpWorkers();
+                    resolve();
+                }).catch(reject);
+        }
+    });
+
+    suite.runTestCasesAndFinish();
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;runTest()&quot;&gt;
+&lt;p&gt;Tests for Worker.workerCreated and Worker.workerTerminated events.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -1231,6 +1231,7 @@
</span><span class="cx">     ${JAVASCRIPTCORE_DIR}/inspector/protocol/Runtime.json
</span><span class="cx">     ${JAVASCRIPTCORE_DIR}/inspector/protocol/ScriptProfiler.json
</span><span class="cx">     ${JAVASCRIPTCORE_DIR}/inspector/protocol/Timeline.json
</span><ins>+    ${JAVASCRIPTCORE_DIR}/inspector/protocol/Worker.json
</ins><span class="cx"> )
</span><span class="cx"> 
</span><span class="cx"> if (ENABLE_INDEXED_DATABASE)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/JavaScriptCore/ChangeLog	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2016-10-27  Joseph Pecoraro  &lt;pecoraro at apple.com&gt;
+
+        Web Inspector: Introduce Page WorkerAgent and Worker InspectorController
+        https://bugs.webkit.org/show_bug.cgi?id=163817
+        &lt;rdar://problem/28899063&gt;
+
+        Reviewed by Brian Burg.
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * inspector/protocol/Worker.json: Added.
+        New Worker domain.
+
</ins><span class="cx"> 2016-10-26  JF Bastien  &lt;jfbastien at apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WebAssembly API: implement Instance
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreDerivedSourcesmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/DerivedSources.make (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/DerivedSources.make	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/JavaScriptCore/DerivedSources.make	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -223,6 +223,7 @@
</span><span class="cx">     $(JavaScriptCore)/inspector/protocol/Runtime.json \
</span><span class="cx">     $(JavaScriptCore)/inspector/protocol/ScriptProfiler.json \
</span><span class="cx">     $(JavaScriptCore)/inspector/protocol/Timeline.json \
</span><ins>+    $(JavaScriptCore)/inspector/protocol/Worker.json \
</ins><span class="cx"> #
</span><span class="cx"> 
</span><span class="cx"> ifeq ($(findstring ENABLE_INDEXED_DATABASE,$(FEATURE_DEFINES)), ENABLE_INDEXED_DATABASE)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorprotocolWorkerjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/inspector/protocol/Worker.json (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/protocol/Worker.json	                        (rev 0)
+++ trunk/Source/JavaScriptCore/inspector/protocol/Worker.json	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,45 @@
</span><ins>+{
+    &quot;domain&quot;: &quot;Worker&quot;,
+    &quot;availability&quot;: &quot;web&quot;,
+    &quot;types&quot;: [],
+    &quot;commands&quot;: [
+        {
+            &quot;name&quot;: &quot;enable&quot;,
+            &quot;description&quot;: &quot;Enable Worker domain events.&quot;
+        },
+        {
+            &quot;name&quot;: &quot;disable&quot;,
+            &quot;description&quot;: &quot;Disable Worker domain events.&quot;
+        },
+        {
+            &quot;name&quot;: &quot;sendMessageToWorker&quot;,
+            &quot;description&quot;: &quot;Send an Inspector Protocol message to be dispatched to a Worker's agents.&quot;,
+            &quot;parameters&quot;: [
+                { &quot;name&quot;: &quot;workerId&quot;, &quot;type&quot;: &quot;string&quot; },
+                { &quot;name&quot;: &quot;message&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;JSON Inspector Protocol message (command) to be dispatched on the backend.&quot; }
+            ]
+        }
+    ],
+    &quot;events&quot;: [
+        {
+            &quot;name&quot;: &quot;workerCreated&quot;,
+            &quot;parameters&quot;: [
+                { &quot;name&quot;: &quot;workerId&quot;, &quot;type&quot;: &quot;string&quot; },
+                { &quot;name&quot;: &quot;url&quot;, &quot;type&quot;: &quot;string&quot; }
+            ]
+        },
+        {
+            &quot;name&quot;: &quot;workerTerminated&quot;,
+            &quot;parameters&quot;: [
+                { &quot;name&quot;: &quot;workerId&quot;, &quot;type&quot;: &quot;string&quot; }
+            ]
+        },
+        {
+            &quot;name&quot;: &quot;dispatchMessageFromWorker&quot;,
+            &quot;parameters&quot;: [
+                { &quot;name&quot;: &quot;workerId&quot;, &quot;type&quot;: &quot;string&quot; },
+                { &quot;name&quot;: &quot;message&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;JSON Inspector Protocol message (response or event) to be dispatched on the frontend.&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/CMakeLists.txt	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -1894,6 +1894,7 @@
</span><span class="cx">     inspector/InspectorPageAgent.cpp
</span><span class="cx">     inspector/InspectorStyleSheet.cpp
</span><span class="cx">     inspector/InspectorTimelineAgent.cpp
</span><ins>+    inspector/InspectorWorkerAgent.cpp
</ins><span class="cx">     inspector/InstrumentingAgents.cpp
</span><span class="cx">     inspector/NetworkResourcesData.cpp
</span><span class="cx">     inspector/PageConsoleAgent.cpp
</span><span class="lines">@@ -1906,6 +1907,8 @@
</span><span class="cx">     inspector/WebDebuggerAgent.cpp
</span><span class="cx">     inspector/WebInjectedScriptHost.cpp
</span><span class="cx">     inspector/WebInjectedScriptManager.cpp
</span><ins>+    inspector/WorkerInspectorController.cpp
+    inspector/WorkerScriptDebugServer.cpp
</ins><span class="cx"> 
</span><span class="cx">     loader/ContentFilter.cpp
</span><span class="cx">     loader/CookieJar.cpp
</span><span class="lines">@@ -2848,6 +2851,7 @@
</span><span class="cx">     workers/WorkerConsoleClient.cpp
</span><span class="cx">     workers/WorkerEventQueue.cpp
</span><span class="cx">     workers/WorkerGlobalScope.cpp
</span><ins>+    workers/WorkerInspectorProxy.cpp
</ins><span class="cx">     workers/WorkerLocation.cpp
</span><span class="cx">     workers/WorkerMessagingProxy.cpp
</span><span class="cx">     workers/WorkerRunLoop.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/ChangeLog	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -1,3 +1,164 @@
</span><ins>+2016-10-27  Joseph Pecoraro  &lt;pecoraro at apple.com&gt;
+
+        Web Inspector: Introduce Page WorkerAgent and Worker InspectorController
+        https://bugs.webkit.org/show_bug.cgi?id=163817
+        &lt;rdar://problem/28899063&gt;
+
+        Reviewed by Brian Burg.
+
+        Test: inspector/worker/worker-create-and-terminate.html
+
+        From the perspective of an Inspector frontend, Workers are
+        like a special JavaScript context, separate from the page, that
+        may have its own set of Agents. This patch adds the necessary
+        backend infrastructure to provide WorkerGlobalObject with an
+        InspectorController and the means to communicate with a frontend
+        through a Page's WorkerAgent.
+
+        Pages now get a WorkerAgent. This informs the frontend about
+        created and terminated Workers. It also provides a communication
+        channel to dispatch and return inspector protocol messages to
+        each of the Workers. The Page side always interacts with the
+        WorkerInspectorProxy on the main thread. The Page's Worker Agent
+        can sends and receives messages to WorkerInspectorControllers.
+
+        WorkerGlobalScopes now get a WorkerInspectorController which
+        will eventually contain its own set of agents. There are no
+        agents yet, but they will be added individually in follow-up
+        patches. The Worker side always interacts with the
+        WorkerGlobalScope on the worker thread. WorkerInspectorController
+        dispatches messages on its agents.
+
+        All communication with Worker agents goes through Worker.sendMessageToWorker,
+        which tunnels the command request to the Worker's InspectorController
+        and agents. At the protocol level, worker agent command responses and
+        worker agent events are sent as events through Worker.dispatchMessageFromWorker.
+        On the frontend, the message dispatcher code will pair up replies with
+        their commands, and no-reply messages as events, like normal. So calling
+        worker agent methods in the frontend will be no different from the
+        existing callback/promise-based ways.
+
+        * CMakeLists.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * inspector/InspectorAllInOne.cpp:
+        Add new files.
+
+        * bindings/js/WorkerScriptController.cpp:
+        (WebCore::WorkerScriptController::WorkerScriptController):
+        (WebCore::WorkerScriptController::initScript):
+        * bindings/js/WorkerScriptController.h:
+        Some cleanup.
+
+        * inspector/InspectorController.cpp:
+        (WebCore::InspectorController::InspectorController):
+        * inspector/InspectorController.h:
+        * inspector/InstrumentingAgents.cpp:
+        (WebCore::InstrumentingAgents::reset):
+        * inspector/InstrumentingAgents.h:
+        (WebCore::InstrumentingAgents::inspectorWorkerAgent):
+        (WebCore::InstrumentingAgents::setInspectorWorkerAgent):
+        * inspector/InspectorInstrumentation.cpp:
+        (WebCore::InspectorInstrumentation::workerStartedImpl):
+        (WebCore::InspectorInstrumentation::workerTerminatedImpl):
+        (WebCore::InspectorInstrumentation::instrumentingAgentsForWorkerGlobalScope):
+        * inspector/InspectorInstrumentation.h:
+        (WebCore::InspectorInstrumentation::workerStarted):
+        (WebCore::InspectorInstrumentation::workerTerminated):
+        (WebCore::InspectorInstrumentation::instrumentingAgentsForContext):
+        Give the Page a WorkerAgent and Instrumentation methods for
+        Worker creation and termination.
+
+        * inspector/InspectorWorkerAgent.h: Added.
+        * inspector/InspectorWorkerAgent.cpp: Added.
+        (WebCore::InspectorWorkerAgent::InspectorWorkerAgent):
+        (WebCore::InspectorWorkerAgent::didCreateFrontendAndBackend):
+        (WebCore::InspectorWorkerAgent::willDestroyFrontendAndBackend):
+        (WebCore::InspectorWorkerAgent::enable):
+        (WebCore::InspectorWorkerAgent::disable):
+        (WebCore::InspectorWorkerAgent::workerStarted):
+        (WebCore::InspectorWorkerAgent::workerTerminated):
+        (WebCore::InspectorWorkerAgent::connectToAllWorkerInspectorProxiesForPage):
+        (WebCore::InspectorWorkerAgent::disconnectFromAllWorkerInspectorProxies):
+        (WebCore::InspectorWorkerAgent::connectToWorkerInspectorProxy):
+        (WebCore::InspectorWorkerAgent::disconnectFromWorkerInspectorProxy):
+        Handle connecting to Workers. This performs the &quot;connectFrontend&quot;
+        and &quot;disconnectFrontend&quot; dance with each Worker's InspectorController.
+        We only connect to workers when the Worker domain is enabled.
+
+        (WebCore::InspectorWorkerAgent::sendMessageToWorker):
+        (WebCore::InspectorWorkerAgent::sendMessageFromWorkerToFrontend):
+        Proxying messages to individual messages happens through the
+        WorkerInspectorProxy. That takes care of passing messages
+        across threads for us.
+
+        * workers/WorkerInspectorProxy.cpp: Added.
+        (WebCore::WorkerInspectorProxy::allWorkerInspectorProxies):
+        (WebCore::WorkerInspectorProxy::WorkerInspectorProxy):
+        (WebCore::WorkerInspectorProxy::~WorkerInspectorProxy):
+        (WebCore::WorkerInspectorProxy::workerStarted):
+        (WebCore::WorkerInspectorProxy::workerTerminated):
+        (WebCore::WorkerInspectorProxy::connectToWorkerInspector):
+        (WebCore::WorkerInspectorProxy::disconnectFromWorkerInspector):
+        (WebCore::WorkerInspectorProxy::sendMessageToWorkerInspector):
+        (WebCore::WorkerInspectorProxy::sendMessageFromWorkerToFrontend):
+        * workers/WorkerInspectorProxy.h: Added.
+        (WebCore::WorkerInspectorProxy::PageChannel::~PageChannel):
+        (WebCore::WorkerInspectorProxy::url):
+        (WebCore::WorkerInspectorProxy::identifier):
+        (WebCore::WorkerInspectorProxy::scriptExecutionContext):
+        The WorkerInspectorProxy simplifies the cross thread communication
+        between the Page Inspector and Worker Inspector. It also provides
+        a clean interface between the two sides.
+
+        * inspector/WorkerToPageFrontendChannel.h: Added.
+        * inspector/WorkerInspectorController.h: Added.
+        * inspector/WorkerInspectorController.cpp: Added.
+        (WebCore::WorkerInspectorController::WorkerInspectorController):
+        (WebCore::WorkerInspectorController::~WorkerInspectorController):
+        (WebCore::WorkerInspectorController::workerTerminating):
+        (WebCore::WorkerInspectorController::connectFrontend):
+        (WebCore::WorkerInspectorController::disconnectFrontend):
+        (WebCore::WorkerInspectorController::dispatchMessageFromFrontend):
+        (WebCore::WorkerInspectorController::functionCallHandler):
+        (WebCore::WorkerInspectorController::evaluateHandler):
+        (WebCore::WorkerInspectorController::vm):
+        A basic InspectorController for a WorkerGlobalScope.
+        No agents yet, they will come soon.
+
+        * inspector/WorkerScriptDebugServer.h:
+        * inspector/WorkerScriptDebugServer.cpp:
+        (WebCore::WorkerScriptDebugServer::WorkerScriptDebugServer):
+        (WebCore::WorkerScriptDebugServer::attachDebugger):
+        (WebCore::WorkerScriptDebugServer::detachDebugger):
+        (WebCore::WorkerScriptDebugServer::recompileAllJSFunctions):
+        (WebCore::WorkerScriptDebugServer::runEventLoopWhilePaused):
+        (WebCore::WorkerScriptDebugServer::reportException):
+        (WebCore::WorkerScriptDebugServer::interruptAndRunTask):
+        A basic WorkerScriptDebug server for a WorkerGlobalScope.
+        Not really used until we implement DebuggerAgent, but needed for InspectorEnvironment.
+
+        * workers/WorkerGlobalScope.cpp:
+        (WebCore::WorkerGlobalScope::WorkerGlobalScope):
+        * workers/WorkerGlobalScope.h:
+        (WebCore::WorkerGlobalScope::inspectorController):
+        Give the WorkerGlobalScope an InspectorController.
+
+        * workers/WorkerThread.cpp:
+        (WebCore::WorkerThread::stop):
+        Ensure the Worker InspectorController is immediately on
+        the WorkerThread when it is about to be closed.
+
+        * workers/WorkerMessagingProxy.cpp:
+        (WebCore::WorkerMessagingProxy::WorkerMessagingProxy):
+        (WebCore::WorkerMessagingProxy::startWorkerGlobalScope):
+        (WebCore::WorkerMessagingProxy::postMessageToPageInspector):
+        (WebCore::WorkerMessagingProxy::workerGlobalScopeDestroyedInternal):
+        (WebCore::WorkerMessagingProxy::terminateWorkerGlobalScope):
+        * workers/WorkerMessagingProxy.h:
+        * workers/WorkerReportingProxy.h:
+        Call into the WorkerInspectorProxy for any inspector related logic,
+        such as creation, termination, and messages received from the Worker.
+
</ins><span class="cx"> 2016-10-27  Dave Hyatt  &lt;hyatt at apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Parser] Implement CSS variables
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -3885,6 +3885,15 @@
</span><span class="cx"> 		A516E8B8136E04DB0076C3C0 /* LocalizedDateCache.mm in Sources */ = {isa = PBXBuildFile; fileRef = A516E8B5136E04DB0076C3C0 /* LocalizedDateCache.mm */; };
</span><span class="cx"> 		A5416FE518810EF80009FC5F /* YouTubeEmbedShadowElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5416FE318810EF80009FC5F /* YouTubeEmbedShadowElement.cpp */; };
</span><span class="cx"> 		A5416FE618810EF80009FC5F /* YouTubeEmbedShadowElement.h in Headers */ = {isa = PBXBuildFile; fileRef = A5416FE418810EF80009FC5F /* YouTubeEmbedShadowElement.h */; };
</span><ins>+		A54A0C5D1DB6D9C00017A90B /* InspectorWorkerAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A54A0C5B1DB6D9B10017A90B /* InspectorWorkerAgent.cpp */; };
+		A54A0C5E1DB6D9C40017A90B /* InspectorWorkerAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = A54A0C5C1DB6D9B10017A90B /* InspectorWorkerAgent.h */; };
+		A54A0C611DB7F8C10017A90B /* WorkerInspectorController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A54A0C5F1DB7F8B70017A90B /* WorkerInspectorController.cpp */; };
+		A54A0C621DB7F8C10017A90B /* WorkerInspectorController.h in Headers */ = {isa = PBXBuildFile; fileRef = A54A0C601DB7F8B70017A90B /* WorkerInspectorController.h */; };
+		A54A0C651DB805360017A90B /* WorkerScriptDebugServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A54A0C631DB805320017A90B /* WorkerScriptDebugServer.cpp */; };
+		A54A0C661DB805360017A90B /* WorkerScriptDebugServer.h in Headers */ = {isa = PBXBuildFile; fileRef = A54A0C641DB805320017A90B /* WorkerScriptDebugServer.h */; };
+		A54A0C681DB807D90017A90B /* WorkerToPageFrontendChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = A54A0C671DB807D00017A90B /* WorkerToPageFrontendChannel.h */; };
+		A54A0C6B1DB831F90017A90B /* WorkerInspectorProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A54A0C691DB831F10017A90B /* WorkerInspectorProxy.cpp */; };
+		A54A0C6C1DB831F90017A90B /* WorkerInspectorProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = A54A0C6A1DB831F20017A90B /* WorkerInspectorProxy.h */; };
</ins><span class="cx"> 		A55639D11C6F09E300806D8E /* WorkerConsoleClient.h in Headers */ = {isa = PBXBuildFile; fileRef = A55639D01C6EFD5900806D8E /* WorkerConsoleClient.h */; };
</span><span class="cx"> 		A55639D21C6F09E700806D8E /* WorkerConsoleClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A55639CF1C6EFD5900806D8E /* WorkerConsoleClient.cpp */; };
</span><span class="cx"> 		A56C5B9A189F34570082D13C /* WebConsoleAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A56C5B98189F34570082D13C /* WebConsoleAgent.cpp */; };
</span><span class="lines">@@ -11363,6 +11372,15 @@
</span><span class="cx"> 		A518225517E2A0D400A9BA1D /* InspectorOverlayPage.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = InspectorOverlayPage.js; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx"> 		A5416FE318810EF80009FC5F /* YouTubeEmbedShadowElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = YouTubeEmbedShadowElement.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx"> 		A5416FE418810EF80009FC5F /* YouTubeEmbedShadowElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YouTubeEmbedShadowElement.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+		A54A0C5B1DB6D9B10017A90B /* InspectorWorkerAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorWorkerAgent.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+		A54A0C5C1DB6D9B10017A90B /* InspectorWorkerAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorWorkerAgent.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+		A54A0C5F1DB7F8B70017A90B /* WorkerInspectorController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkerInspectorController.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+		A54A0C601DB7F8B70017A90B /* WorkerInspectorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerInspectorController.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+		A54A0C631DB805320017A90B /* WorkerScriptDebugServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkerScriptDebugServer.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+		A54A0C641DB805320017A90B /* WorkerScriptDebugServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerScriptDebugServer.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+		A54A0C671DB807D00017A90B /* WorkerToPageFrontendChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerToPageFrontendChannel.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+		A54A0C691DB831F10017A90B /* WorkerInspectorProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkerInspectorProxy.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+		A54A0C6A1DB831F20017A90B /* WorkerInspectorProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerInspectorProxy.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx"> 		A55639CF1C6EFD5900806D8E /* WorkerConsoleClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkerConsoleClient.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx"> 		A55639D01C6EFD5900806D8E /* WorkerConsoleClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerConsoleClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx"> 		A56C5B98189F34570082D13C /* WebConsoleAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebConsoleAgent.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -15837,6 +15855,8 @@
</span><span class="cx"> 				754133A9102E00F400075D00 /* InspectorTimelineAgent.cpp */,
</span><span class="cx"> 				754133A7102E00E800075D00 /* InspectorTimelineAgent.h */,
</span><span class="cx"> 				A593CF8A1840535200BFCE27 /* InspectorWebAgentBase.h */,
</span><ins>+				A54A0C5B1DB6D9B10017A90B /* InspectorWorkerAgent.cpp */,
+				A54A0C5C1DB6D9B10017A90B /* InspectorWorkerAgent.h */,
</ins><span class="cx"> 				F350B73413F1377D00880C43 /* InstrumentingAgents.cpp */,
</span><span class="cx"> 				F3ABFE0B130E9DA000E7F7D1 /* InstrumentingAgents.h */,
</span><span class="cx"> 				59C27F04138D28C10079B7E2 /* NetworkResourcesData.cpp */,
</span><span class="lines">@@ -15861,6 +15881,11 @@
</span><span class="cx"> 				A5840E23187B8AC200843B10 /* WebInjectedScriptHost.h */,
</span><span class="cx"> 				A584FE2D1864CB8400843B10 /* WebInjectedScriptManager.cpp */,
</span><span class="cx"> 				A584FE2E1864CB8400843B10 /* WebInjectedScriptManager.h */,
</span><ins>+				A54A0C5F1DB7F8B70017A90B /* WorkerInspectorController.cpp */,
+				A54A0C601DB7F8B70017A90B /* WorkerInspectorController.h */,
+				A54A0C631DB805320017A90B /* WorkerScriptDebugServer.cpp */,
+				A54A0C641DB805320017A90B /* WorkerScriptDebugServer.h */,
+				A54A0C671DB807D00017A90B /* WorkerToPageFrontendChannel.h */,
</ins><span class="cx"> 			);
</span><span class="cx"> 			path = inspector;
</span><span class="cx"> 			sourceTree = &quot;&lt;group&gt;&quot;;
</span><span class="lines">@@ -16097,6 +16122,8 @@
</span><span class="cx"> 				2E4346370F546A8200B0F1BA /* WorkerGlobalScope.h */,
</span><span class="cx"> 				2E4346380F546A8200B0F1BA /* WorkerGlobalScope.idl */,
</span><span class="cx"> 				2E4346390F546A8200B0F1BA /* WorkerGlobalScopeProxy.h */,
</span><ins>+				A54A0C691DB831F10017A90B /* WorkerInspectorProxy.cpp */,
+				A54A0C6A1DB831F20017A90B /* WorkerInspectorProxy.h */,
</ins><span class="cx"> 				18F831B70FD48C7800D8C56B /* WorkerLoaderProxy.h */,
</span><span class="cx"> 				2E43463A0F546A8200B0F1BA /* WorkerLocation.cpp */,
</span><span class="cx"> 				2E43463B0F546A8200B0F1BA /* WorkerLocation.h */,
</span><span class="lines">@@ -25495,6 +25522,7 @@
</span><span class="cx"> 				82AB1774125C826700C5069D /* InspectorStyleSheet.h in Headers */,
</span><span class="cx"> 				754133A8102E00E800075D00 /* InspectorTimelineAgent.h in Headers */,
</span><span class="cx"> 				A593CF8B1840535200BFCE27 /* InspectorWebAgentBase.h in Headers */,
</span><ins>+				A54A0C5E1DB6D9C40017A90B /* InspectorWorkerAgent.h in Headers */,
</ins><span class="cx"> 				F3ABFE0C130E9DA000E7F7D1 /* InstrumentingAgents.h in Headers */,
</span><span class="cx"> 				B27535720B053814002CE64F /* IntPoint.h in Headers */,
</span><span class="cx"> 				E462A4A1113E71BE004A4220 /* IntPointHash.h in Headers */,
</span><span class="lines">@@ -27790,6 +27818,8 @@
</span><span class="cx"> 				5185FCB41BB4C4E80012898F /* WorkerGlobalScopeIndexedDatabase.h in Headers */,
</span><span class="cx"> 				97F8E666151D4A4E00D2D181 /* WorkerGlobalScopeNotifications.h in Headers */,
</span><span class="cx"> 				2E43464B0F546A8200B0F1BA /* WorkerGlobalScopeProxy.h in Headers */,
</span><ins>+				A54A0C621DB7F8C10017A90B /* WorkerInspectorController.h in Headers */,
+				A54A0C6C1DB831F90017A90B /* WorkerInspectorProxy.h in Headers */,
</ins><span class="cx"> 				18F831B80FD48C7800D8C56B /* WorkerLoaderProxy.h in Headers */,
</span><span class="cx"> 				2E43464D0F546A8200B0F1BA /* WorkerLocation.h in Headers */,
</span><span class="cx"> 				2E4346500F546A8200B0F1BA /* WorkerMessagingProxy.h in Headers */,
</span><span class="lines">@@ -27799,11 +27829,13 @@
</span><span class="cx"> 				416E29A6102FA962007FC14E /* WorkerReportingProxy.h in Headers */,
</span><span class="cx"> 				2E4346530F546A8200B0F1BA /* WorkerRunLoop.h in Headers */,
</span><span class="cx"> 				E1A643F20EC0972500779668 /* WorkerScriptController.h in Headers */,
</span><ins>+				A54A0C661DB805360017A90B /* WorkerScriptDebugServer.h in Headers */,
</ins><span class="cx"> 				A7D6B3490F61104500B79FD1 /* WorkerScriptLoader.h in Headers */,
</span><span class="cx"> 				2EA768040FE7126400AB9C8A /* WorkerScriptLoaderClient.h in Headers */,
</span><span class="cx"> 				2E4346550F546A8200B0F1BA /* WorkerThread.h in Headers */,
</span><span class="cx"> 				0B9056F90F2685F30095FF6A /* WorkerThreadableLoader.h in Headers */,
</span><span class="cx"> 				97AABD2D14FA09D5007457AE /* WorkerThreadableWebSocketChannel.h in Headers */,
</span><ins>+				A54A0C681DB807D90017A90B /* WorkerToPageFrontendChannel.h in Headers */,
</ins><span class="cx"> 				93309E24099E64920056E581 /* WrapContentsInDummySpanCommand.h in Headers */,
</span><span class="cx"> 				416E6FE91BBD12E5000A6053 /* WritableStreamBuiltins.h in Headers */,
</span><span class="cx"> 				416E6FE81BBD12DF000A6053 /* WritableStreamInternalsBuiltins.h in Headers */,
</span><span class="lines">@@ -29175,6 +29207,7 @@
</span><span class="cx"> 				99CC0B6618BE9F15006CEBCC /* InspectorReplayAgent.cpp in Sources */,
</span><span class="cx"> 				82AB1773125C826700C5069D /* InspectorStyleSheet.cpp in Sources */,
</span><span class="cx"> 				754133AA102E00F400075D00 /* InspectorTimelineAgent.cpp in Sources */,
</span><ins>+				A54A0C5D1DB6D9C00017A90B /* InspectorWorkerAgent.cpp in Sources */,
</ins><span class="cx"> 				F350B73513F1377D00880C43 /* InstrumentingAgents.cpp in Sources */,
</span><span class="cx"> 				2D46F04E17B96FBD005647F0 /* IntPoint.cpp in Sources */,
</span><span class="cx"> 				B27535600B053814002CE64F /* IntPointCG.cpp in Sources */,
</span><span class="lines">@@ -31235,11 +31268,14 @@
</span><span class="cx"> 				418C395A1C8DD6990051C8A3 /* WorkerGlobalScopeFetch.cpp in Sources */,
</span><span class="cx"> 				5185FCB31BB4C4E80012898F /* WorkerGlobalScopeIndexedDatabase.cpp in Sources */,
</span><span class="cx"> 				97F8E665151D4A4B00D2D181 /* WorkerGlobalScopeNotifications.cpp in Sources */,
</span><ins>+				A54A0C611DB7F8C10017A90B /* WorkerInspectorController.cpp in Sources */,
+				A54A0C6B1DB831F90017A90B /* WorkerInspectorProxy.cpp in Sources */,
</ins><span class="cx"> 				2E43464C0F546A8200B0F1BA /* WorkerLocation.cpp in Sources */,
</span><span class="cx"> 				2E43464F0F546A8200B0F1BA /* WorkerMessagingProxy.cpp in Sources */,
</span><span class="cx"> 				E1271A140EEEC80400F61213 /* WorkerNavigator.cpp in Sources */,
</span><span class="cx"> 				2E4346520F546A8200B0F1BA /* WorkerRunLoop.cpp in Sources */,
</span><span class="cx"> 				E1A643FD0EC097A000779668 /* WorkerScriptController.cpp in Sources */,
</span><ins>+				A54A0C651DB805360017A90B /* WorkerScriptDebugServer.cpp in Sources */,
</ins><span class="cx"> 				A7D6B34A0F61104500B79FD1 /* WorkerScriptLoader.cpp in Sources */,
</span><span class="cx"> 				2E4346540F546A8200B0F1BA /* WorkerThread.cpp in Sources */,
</span><span class="cx"> 				0B9056F80F2685F30095FF6A /* WorkerThreadableLoader.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsWorkerScriptControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/WorkerScriptController.cpp (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/WorkerScriptController.cpp	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/bindings/js/WorkerScriptController.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -21,8 +21,7 @@
</span><span class="cx">  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
</span><span class="cx">  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
</span><span class="cx">  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
</span><del>- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- *
</del><ins>+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</ins><span class="cx">  */
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="lines">@@ -35,12 +34,9 @@
</span><span class="cx"> #include &quot;WebCoreJSClientData.h&quot;
</span><span class="cx"> #include &quot;WorkerConsoleClient.h&quot;
</span><span class="cx"> #include &quot;WorkerGlobalScope.h&quot;
</span><del>-#include &quot;WorkerObjectProxy.h&quot;
-#include &quot;WorkerThread.h&quot;
</del><span class="cx"> #include &lt;bindings/ScriptValue.h&gt;
</span><span class="cx"> #include &lt;heap/StrongInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/Completion.h&gt;
</span><del>-#include &lt;runtime/Error.h&gt;
</del><span class="cx"> #include &lt;runtime/Exception.h&gt;
</span><span class="cx"> #include &lt;runtime/ExceptionHelpers.h&gt;
</span><span class="cx"> #include &lt;runtime/JSLock.h&gt;
</span><span class="lines">@@ -54,7 +50,6 @@
</span><span class="cx">     : m_vm(VM::create())
</span><span class="cx">     , m_workerGlobalScope(workerGlobalScope)
</span><span class="cx">     , m_workerGlobalScopeWrapper(*m_vm)
</span><del>-    , m_executionForbidden(false)
</del><span class="cx"> {
</span><span class="cx">     m_vm-&gt;ensureWatchdog();
</span><span class="cx">     initNormalWorldClientData(m_vm.get());
</span><span class="lines">@@ -81,9 +76,9 @@
</span><span class="cx">     // when we allocate the global object. (Once the global object is fully
</span><span class="cx">     // constructed, it can mark its own prototype.)
</span><span class="cx">     if (m_workerGlobalScope-&gt;isDedicatedWorkerGlobalScope()) {
</span><del>-        Structure* dedicatedContextPrototypeStructure = JSDedicatedWorkerGlobalScopePrototype::createStructure(*m_vm, 0, jsNull());
-        Strong&lt;JSDedicatedWorkerGlobalScopePrototype&gt; dedicatedContextPrototype(*m_vm, JSDedicatedWorkerGlobalScopePrototype::create(*m_vm, 0, dedicatedContextPrototypeStructure));
-        Structure* structure = JSDedicatedWorkerGlobalScope::createStructure(*m_vm, 0, dedicatedContextPrototype.get());
</del><ins>+        Structure* dedicatedContextPrototypeStructure = JSDedicatedWorkerGlobalScopePrototype::createStructure(*m_vm, nullptr, jsNull());
+        Strong&lt;JSDedicatedWorkerGlobalScopePrototype&gt; dedicatedContextPrototype(*m_vm, JSDedicatedWorkerGlobalScopePrototype::create(*m_vm, nullptr, dedicatedContextPrototypeStructure));
+        Structure* structure = JSDedicatedWorkerGlobalScope::createStructure(*m_vm, nullptr, dedicatedContextPrototype.get());
</ins><span class="cx">         auto* proxyStructure = JSProxy::createStructure(*m_vm, nullptr, jsNull(), PureForwardingProxyType);
</span><span class="cx">         auto* proxy = JSProxy::create(*m_vm, proxyStructure);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsWorkerScriptControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/WorkerScriptController.h (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/WorkerScriptController.h	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/bindings/js/WorkerScriptController.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -22,11 +22,9 @@
</span><span class="cx">  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
</span><span class="cx">  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
</span><span class="cx">  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
</span><del>- *
</del><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef WorkerScriptController_h
-#define WorkerScriptController_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #include &lt;debugger/Debugger.h&gt;
</span><span class="cx"> #include &lt;heap/Strong.h&gt;
</span><span class="lines">@@ -34,10 +32,6 @@
</span><span class="cx"> #include &lt;wtf/Lock.h&gt;
</span><span class="cx"> #include &lt;wtf/NakedPtr.h&gt;
</span><span class="cx"> 
</span><del>-namespace Deprecated {
-class ScriptValue;
-}
-
</del><span class="cx"> namespace JSC {
</span><span class="cx"> class VM;
</span><span class="cx"> }
</span><span class="lines">@@ -98,11 +92,9 @@
</span><span class="cx">         WorkerGlobalScope* m_workerGlobalScope;
</span><span class="cx">         JSC::Strong&lt;JSWorkerGlobalScope&gt; m_workerGlobalScopeWrapper;
</span><span class="cx">         std::unique_ptr&lt;WorkerConsoleClient&gt; m_consoleClient;
</span><del>-        bool m_executionForbidden;
</del><ins>+        bool m_executionForbidden { false };
</ins><span class="cx">         bool m_isTerminatingExecution { false };
</span><span class="cx">         mutable Lock m_scheduledTerminationMutex;
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><del>-
-#endif // WorkerScriptController_h
</del></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorAllInOnecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorAllInOne.cpp (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorAllInOne.cpp	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/inspector/InspectorAllInOne.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -50,6 +50,7 @@
</span><span class="cx"> #include &quot;InspectorPageAgent.cpp&quot;
</span><span class="cx"> #include &quot;InspectorStyleSheet.cpp&quot;
</span><span class="cx"> #include &quot;InspectorTimelineAgent.cpp&quot;
</span><ins>+#include &quot;InspectorWorkerAgent.cpp&quot;
</ins><span class="cx"> #include &quot;InstrumentingAgents.cpp&quot;
</span><span class="cx"> #include &quot;NetworkResourcesData.cpp&quot;
</span><span class="cx"> #include &quot;PageConsoleAgent.cpp&quot;
</span><span class="lines">@@ -62,3 +63,5 @@
</span><span class="cx"> #include &quot;WebDebuggerAgent.cpp&quot;
</span><span class="cx"> #include &quot;WebInjectedScriptHost.cpp&quot;
</span><span class="cx"> #include &quot;WebInjectedScriptManager.cpp&quot;
</span><ins>+#include &quot;WorkerInspectorController.cpp&quot;
+#include &quot;WorkerScriptDebugServer.cpp&quot;
</ins></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorController.cpp (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorController.cpp	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/inspector/InspectorController.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -51,6 +51,7 @@
</span><span class="cx"> #include &quot;InspectorPageAgent.h&quot;
</span><span class="cx"> #include &quot;InspectorReplayAgent.h&quot;
</span><span class="cx"> #include &quot;InspectorTimelineAgent.h&quot;
</span><ins>+#include &quot;InspectorWorkerAgent.h&quot;
</ins><span class="cx"> #include &quot;InstrumentingAgents.h&quot;
</span><span class="cx"> #include &quot;JSDOMWindow.h&quot;
</span><span class="cx"> #include &quot;JSDOMWindowCustom.h&quot;
</span><span class="lines">@@ -178,6 +179,7 @@
</span><span class="cx">     m_agents.append(std::make_unique&lt;InspectorDOMDebuggerAgent&gt;(pageContext, m_domAgent, debuggerAgent));
</span><span class="cx">     m_agents.append(std::make_unique&lt;InspectorApplicationCacheAgent&gt;(pageContext, pageAgent));
</span><span class="cx">     m_agents.append(std::make_unique&lt;InspectorLayerTreeAgent&gt;(pageContext));
</span><ins>+    m_agents.append(std::make_unique&lt;InspectorWorkerAgent&gt;(pageContext));
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(m_injectedScriptManager-&gt;commandLineAPIHost());
</span><span class="cx">     if (CommandLineAPIHost* commandLineAPIHost = m_injectedScriptManager-&gt;commandLineAPIHost()) {
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorController.h (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorController.h	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/inspector/InspectorController.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -105,6 +105,8 @@
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT Ref&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::OverlayTypes::NodeHighlightData&gt;&gt; buildObjectForHighlightedNodes() const;
</span><span class="cx"> 
</span><ins>+    WEBCORE_EXPORT void didComposite(Frame&amp;);
+
</ins><span class="cx">     bool isUnderTest() const { return m_isUnderTest; }
</span><span class="cx">     WEBCORE_EXPORT void setIsUnderTest(bool);
</span><span class="cx">     WEBCORE_EXPORT void evaluateForTestInFrontend(const String&amp; script);
</span><span class="lines">@@ -113,6 +115,7 @@
</span><span class="cx">     InspectorFrontendClient* inspectorFrontendClient() const { return m_inspectorFrontendClient; }
</span><span class="cx">     InspectorPageAgent* pageAgent() const { return m_pageAgent; }
</span><span class="cx"> 
</span><ins>+    // InspectorEnvironment
</ins><span class="cx">     bool developerExtrasEnabled() const override;
</span><span class="cx">     bool canAccessInspectedScriptState(JSC::ExecState*) const override;
</span><span class="cx">     Inspector::InspectorFunctionCallHandler functionCallHandler() const override;
</span><span class="lines">@@ -122,8 +125,6 @@
</span><span class="cx">     PageScriptDebugServer&amp; scriptDebugServer() override;
</span><span class="cx">     JSC::VM&amp; vm() override;
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT void didComposite(Frame&amp;);
-
</del><span class="cx"> private:
</span><span class="cx">     friend class InspectorInstrumentation;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorInstrumentationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -52,6 +52,7 @@
</span><span class="cx"> #include &quot;InspectorNetworkAgent.h&quot;
</span><span class="cx"> #include &quot;InspectorPageAgent.h&quot;
</span><span class="cx"> #include &quot;InspectorTimelineAgent.h&quot;
</span><ins>+#include &quot;InspectorWorkerAgent.h&quot;
</ins><span class="cx"> #include &quot;InstrumentingAgents.h&quot;
</span><span class="cx"> #include &quot;MainFrame.h&quot;
</span><span class="cx"> #include &quot;Page.h&quot;
</span><span class="lines">@@ -64,6 +65,7 @@
</span><span class="cx"> #include &quot;StyleResolver.h&quot;
</span><span class="cx"> #include &quot;StyleRule.h&quot;
</span><span class="cx"> #include &quot;WebConsoleAgent.h&quot;
</span><ins>+#include &quot;WorkerInspectorController.h&quot;
</ins><span class="cx"> #include &quot;XMLHttpRequest.h&quot;
</span><span class="cx"> #include &lt;inspector/ConsoleMessage.h&gt;
</span><span class="cx"> #include &lt;inspector/ScriptArguments.h&gt;
</span><span class="lines">@@ -925,6 +927,18 @@
</span><span class="cx">         domStorageAgent-&gt;didDispatchDOMStorageEvent(key, oldValue, newValue, storageType, securityOrigin, page);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void InspectorInstrumentation::workerStartedImpl(InstrumentingAgents&amp; instrumentingAgents, WorkerInspectorProxy* proxy, const URL&amp; url)
+{
+    if (InspectorWorkerAgent* workerAgent = instrumentingAgents.inspectorWorkerAgent())
+        workerAgent-&gt;workerStarted(proxy, url);
+}
+
+void InspectorInstrumentation::workerTerminatedImpl(InstrumentingAgents&amp; instrumentingAgents, WorkerInspectorProxy* proxy)
+{
+    if (InspectorWorkerAgent* workerAgent = instrumentingAgents.inspectorWorkerAgent())
+        workerAgent-&gt;workerTerminated(proxy);
+}
+
</ins><span class="cx"> #if ENABLE(WEB_SOCKETS)
</span><span class="cx"> void InspectorInstrumentation::didCreateWebSocketImpl(InstrumentingAgents&amp; instrumentingAgents, unsigned long identifier, const URL&amp; requestURL)
</span><span class="cx"> {
</span><span class="lines">@@ -1189,6 +1203,11 @@
</span><span class="cx">     return instrumentingAgentsForFrame(renderer-&gt;frame());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+InstrumentingAgents* InspectorInstrumentation::instrumentingAgentsForWorkerGlobalScope(WorkerGlobalScope* workerGlobalScope)
+{
+    return workerGlobalScope ? &amp;workerGlobalScope-&gt;inspectorController().m_instrumentingAgents.get() : nullptr;
+}
+
</ins><span class="cx"> void InspectorInstrumentation::layerTreeDidChangeImpl(InstrumentingAgents&amp; instrumentingAgents)
</span><span class="cx"> {
</span><span class="cx">     if (InspectorLayerTreeAgent* layerTreeAgent = instrumentingAgents.inspectorLayerTreeAgent())
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorInstrumentationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorInstrumentation.h (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorInstrumentation.h	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/inspector/InspectorInstrumentation.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx"> * Copyright (C) 2010 Google Inc. All rights reserved.
</span><del>-* Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
</del><ins>+* Copyright (C) 2014-2016 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions are
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> #include &quot;ScriptExecutionContext.h&quot;
</span><span class="cx"> #include &quot;StorageArea.h&quot;
</span><span class="cx"> #include &quot;WebSocketFrame.h&quot;
</span><ins>+#include &quot;WorkerGlobalScope.h&quot;
</ins><span class="cx"> #include &lt;runtime/ConsoleTypes.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -94,7 +95,7 @@
</span><span class="cx"> class StyleRule;
</span><span class="cx"> class ThreadableLoaderClient;
</span><span class="cx"> class URL;
</span><del>-class WorkerGlobalScope;
</del><ins>+class WorkerInspectorProxy;
</ins><span class="cx"> class XMLHttpRequest;
</span><span class="cx"> 
</span><span class="cx"> struct ReplayPosition;
</span><span class="lines">@@ -220,6 +221,9 @@
</span><span class="cx"> 
</span><span class="cx">     static void didDispatchDOMStorageEvent(const String&amp; key, const String&amp; oldValue, const String&amp; newValue, StorageType, SecurityOrigin*, Page*);
</span><span class="cx"> 
</span><ins>+    static void workerStarted(ScriptExecutionContext*, WorkerInspectorProxy*, const URL&amp;);
+    static void workerTerminated(ScriptExecutionContext*, WorkerInspectorProxy*);
+
</ins><span class="cx"> #if ENABLE(WEB_REPLAY)
</span><span class="cx">     static void sessionCreated(Page&amp;, RefPtr&lt;ReplaySession&gt;&amp;&amp;);
</span><span class="cx">     static void sessionLoaded(Page&amp;, RefPtr&lt;ReplaySession&gt;&amp;&amp;);
</span><span class="lines">@@ -389,6 +393,9 @@
</span><span class="cx"> 
</span><span class="cx">     static void didDispatchDOMStorageEventImpl(InstrumentingAgents&amp;, const String&amp; key, const String&amp; oldValue, const String&amp; newValue, StorageType, SecurityOrigin*, Page*);
</span><span class="cx"> 
</span><ins>+    static void workerStartedImpl(InstrumentingAgents&amp;, WorkerInspectorProxy*, const URL&amp;);
+    static void workerTerminatedImpl(InstrumentingAgents&amp;, WorkerInspectorProxy*);
+
</ins><span class="cx"> #if ENABLE(WEB_REPLAY)
</span><span class="cx">     static void sessionCreatedImpl(InstrumentingAgents&amp;, RefPtr&lt;ReplaySession&gt;&amp;&amp;);
</span><span class="cx">     static void sessionLoadedImpl(InstrumentingAgents&amp;, RefPtr&lt;ReplaySession&gt;&amp;&amp;);
</span><span class="lines">@@ -435,6 +442,7 @@
</span><span class="cx">     static InstrumentingAgents* instrumentingAgentsForDocument(Document&amp;);
</span><span class="cx">     static InstrumentingAgents* instrumentingAgentsForDocument(Document*);
</span><span class="cx">     static InstrumentingAgents* instrumentingAgentsForRenderer(RenderObject*);
</span><ins>+    static InstrumentingAgents* instrumentingAgentsForWorkerGlobalScope(WorkerGlobalScope*);
</ins><span class="cx"> 
</span><span class="cx">     static InspectorTimelineAgent* retrieveTimelineAgent(const InspectorInstrumentationCookie&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -1051,6 +1059,20 @@
</span><span class="cx">         didDispatchDOMStorageEventImpl(*instrumentingAgents, key, oldValue, newValue, storageType, securityOrigin, page);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline void InspectorInstrumentation::workerStarted(ScriptExecutionContext* context, WorkerInspectorProxy* proxy, const URL&amp; url)
+{
+    FAST_RETURN_IF_NO_FRONTENDS(void());
+    if (InstrumentingAgents* instrumentingAgents = instrumentingAgentsForContext(context))
+        workerStartedImpl(*instrumentingAgents, proxy, url);
+}
+
+inline void InspectorInstrumentation::workerTerminated(ScriptExecutionContext* context, WorkerInspectorProxy* proxy)
+{
+    FAST_RETURN_IF_NO_FRONTENDS(void());
+    if (InstrumentingAgents* instrumentingAgents = instrumentingAgentsForContext(context))
+        workerTerminatedImpl(*instrumentingAgents, proxy);
+}
+
</ins><span class="cx"> #if ENABLE(WEB_SOCKETS)
</span><span class="cx"> inline void InspectorInstrumentation::didCreateWebSocket(Document* document, unsigned long identifier, const URL&amp; requestURL)
</span><span class="cx"> {
</span><span class="lines">@@ -1251,6 +1273,8 @@
</span><span class="cx">         return nullptr;
</span><span class="cx">     if (is&lt;Document&gt;(*context))
</span><span class="cx">         return instrumentingAgentsForPage(downcast&lt;Document&gt;(context)-&gt;page());
</span><ins>+    if (is&lt;WorkerGlobalScope&gt;(*context))
+        return instrumentingAgentsForWorkerGlobalScope(downcast&lt;WorkerGlobalScope&gt;(context));
</ins><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorWorkerAgentcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/inspector/InspectorWorkerAgent.cpp (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorWorkerAgent.cpp	                        (rev 0)
+++ trunk/Source/WebCore/inspector/InspectorWorkerAgent.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,158 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;InspectorWorkerAgent.h&quot;
+
+#include &quot;Document.h&quot;
+#include &quot;InstrumentingAgents.h&quot;
+
+using namespace Inspector;
+
+namespace WebCore {
+
+InspectorWorkerAgent::InspectorWorkerAgent(PageAgentContext&amp; context)
+    : InspectorAgentBase(ASCIILiteral(&quot;Worker&quot;), context)
+    , m_frontendDispatcher(std::make_unique&lt;Inspector::WorkerFrontendDispatcher&gt;(context.frontendRouter))
+    , m_backendDispatcher(Inspector::WorkerBackendDispatcher::create(context.backendDispatcher, this))
+    , m_page(context.inspectedPage)
+{
+}
+
+void InspectorWorkerAgent::didCreateFrontendAndBackend(FrontendRouter*, BackendDispatcher*)
+{
+    m_instrumentingAgents.setInspectorWorkerAgent(this);
+}
+
+void InspectorWorkerAgent::willDestroyFrontendAndBackend(DisconnectReason)
+{
+    m_instrumentingAgents.setInspectorWorkerAgent(nullptr);
+
+    ErrorString ignored;
+    disable(ignored);
+}
+
+void InspectorWorkerAgent::enable(ErrorString&amp;)
+{
+    if (m_enabled)
+        return;
+
+    m_enabled = true;
+
+    connectToAllWorkerInspectorProxiesForPage();
+}
+
+void InspectorWorkerAgent::disable(ErrorString&amp;)
+{
+    if (!m_enabled)
+        return;
+
+    m_enabled = false;
+
+    disconnectFromAllWorkerInspectorProxies();
+}
+
+void InspectorWorkerAgent::sendMessageToWorker(ErrorString&amp; errorString, const String&amp; workerId, const String&amp; message)
+{
+    if (!m_enabled) {
+        errorString = ASCIILiteral(&quot;Worker inspection must be enabled.&quot;);
+        return;
+    }
+
+    WorkerInspectorProxy* proxy = m_connectedProxies.get(workerId);
+    if (!proxy) {
+        errorString = ASCIILiteral(&quot;Worker not found.&quot;);
+        return;
+    }
+
+    proxy-&gt;sendMessageToWorkerInspectorController(message);
+}
+
+void InspectorWorkerAgent::sendMessageFromWorkerToFrontend(WorkerInspectorProxy* proxy, const String&amp; message)
+{
+    m_frontendDispatcher-&gt;dispatchMessageFromWorker(proxy-&gt;identifier(), message);
+}
+
+void InspectorWorkerAgent::workerStarted(WorkerInspectorProxy* proxy, const URL&amp;)
+{
+    if (!m_enabled)
+        return;
+
+    connectToWorkerInspectorProxy(proxy);
+}
+
+void InspectorWorkerAgent::workerTerminated(WorkerInspectorProxy* proxy)
+{
+    if (!m_enabled)
+        return;
+
+    disconnectFromWorkerInspectorProxy(proxy);
+}
+
+void InspectorWorkerAgent::connectToAllWorkerInspectorProxiesForPage()
+{
+    ASSERT(m_connectedProxies.isEmpty());
+
+    for (auto* proxy : WorkerInspectorProxy::allWorkerInspectorProxies()) {
+        if (!is&lt;Document&gt;(proxy-&gt;scriptExecutionContext()))
+            continue;
+
+        Document&amp; document = downcast&lt;Document&gt;(*proxy-&gt;scriptExecutionContext());
+        if (document.page() != &amp;m_page)
+            continue;
+
+        connectToWorkerInspectorProxy(proxy);
+    }
+}
+
+void InspectorWorkerAgent::disconnectFromAllWorkerInspectorProxies()
+{
+    Vector&lt;WorkerInspectorProxy*&gt; proxies;
+    copyValuesToVector(m_connectedProxies, proxies);
+    for (auto* proxy : proxies)
+        proxy-&gt;disconnectFromWorkerInspectorController();
+
+    m_connectedProxies.clear();
+}
+
+void InspectorWorkerAgent::connectToWorkerInspectorProxy(WorkerInspectorProxy* proxy)
+{
+    proxy-&gt;connectToWorkerInspectorController(this);
+
+    m_connectedProxies.set(proxy-&gt;identifier(), proxy);
+
+    m_frontendDispatcher-&gt;workerCreated(proxy-&gt;identifier(), proxy-&gt;url());
+}
+
+void InspectorWorkerAgent::disconnectFromWorkerInspectorProxy(WorkerInspectorProxy* proxy)
+{
+    m_frontendDispatcher-&gt;workerTerminated(proxy-&gt;identifier());
+
+    m_connectedProxies.remove(proxy-&gt;identifier());
+
+    proxy-&gt;disconnectFromWorkerInspectorController();
+}
+
+} // namespace Inspector
</ins></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorWorkerAgenth"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/inspector/InspectorWorkerAgent.h (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorWorkerAgent.h	                        (rev 0)
+++ trunk/Source/WebCore/inspector/InspectorWorkerAgent.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,77 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &quot;InspectorWebAgentBase.h&quot;
+#include &quot;WorkerInspectorProxy.h&quot;
+#include &lt;inspector/InspectorBackendDispatchers.h&gt;
+#include &lt;inspector/InspectorFrontendDispatchers.h&gt;
+#include &lt;wtf/HashMap.h&gt;
+
+namespace WebCore {
+
+class Page;
+class URL;
+
+typedef String ErrorString;
+
+class InspectorWorkerAgent final : public InspectorAgentBase, public Inspector::WorkerBackendDispatcherHandler, public WorkerInspectorProxy::PageChannel {
+    WTF_MAKE_NONCOPYABLE(InspectorWorkerAgent);
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    InspectorWorkerAgent(PageAgentContext&amp;);
+    virtual ~InspectorWorkerAgent() { }
+
+    void didCreateFrontendAndBackend(Inspector::FrontendRouter*, Inspector::BackendDispatcher*) override;
+    void willDestroyFrontendAndBackend(Inspector::DisconnectReason) override;
+
+    // WorkerBackendDispatcherHandler
+    void enable(ErrorString&amp;) override;
+    void disable(ErrorString&amp;) override;
+    void sendMessageToWorker(ErrorString&amp;, const String&amp; workerId, const String&amp; message) override;
+
+    // PageChannel
+    void sendMessageFromWorkerToFrontend(WorkerInspectorProxy*, const String&amp; message) override;
+
+    // InspectorInstrumentation
+    void workerStarted(WorkerInspectorProxy*, const URL&amp;);
+    void workerTerminated(WorkerInspectorProxy*);
+
+private:
+    void connectToAllWorkerInspectorProxiesForPage();
+    void disconnectFromAllWorkerInspectorProxies();
+    void connectToWorkerInspectorProxy(WorkerInspectorProxy*);
+    void disconnectFromWorkerInspectorProxy(WorkerInspectorProxy*);
+
+    std::unique_ptr&lt;Inspector::WorkerFrontendDispatcher&gt; m_frontendDispatcher;
+    RefPtr&lt;Inspector::WorkerBackendDispatcher&gt; m_backendDispatcher;
+
+    Page&amp; m_page;
+    HashMap&lt;String, WorkerInspectorProxy*&gt; m_connectedProxies;
+    bool m_enabled { false };
+};
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreinspectorInstrumentingAgentscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InstrumentingAgents.cpp (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InstrumentingAgents.cpp	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/inspector/InstrumentingAgents.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx">     m_inspectorPageAgent = nullptr;
</span><span class="cx">     m_inspectorCSSAgent = nullptr;
</span><span class="cx">     m_inspectorLayerTreeAgent = nullptr;
</span><ins>+    m_inspectorWorkerAgent = nullptr;
</ins><span class="cx">     m_webConsoleAgent = nullptr;
</span><span class="cx">     m_inspectorDOMAgent = nullptr;
</span><span class="cx">     m_inspectorNetworkAgent = nullptr;
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInstrumentingAgentsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InstrumentingAgents.h (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InstrumentingAgents.h	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/inspector/InstrumentingAgents.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -50,6 +50,7 @@
</span><span class="cx"> class InspectorDOMStorageAgent;
</span><span class="cx"> class InspectorDatabaseAgent;
</span><span class="cx"> class InspectorLayerTreeAgent;
</span><ins>+class InspectorWorkerAgent;
</ins><span class="cx"> class InspectorMemoryAgent;
</span><span class="cx"> class InspectorNetworkAgent;
</span><span class="cx"> class InspectorPageAgent;
</span><span class="lines">@@ -137,6 +138,9 @@
</span><span class="cx">     InspectorLayerTreeAgent* inspectorLayerTreeAgent() const { return m_inspectorLayerTreeAgent; }
</span><span class="cx">     void setInspectorLayerTreeAgent(InspectorLayerTreeAgent* agent) { m_inspectorLayerTreeAgent = agent; }
</span><span class="cx"> 
</span><ins>+    InspectorWorkerAgent* inspectorWorkerAgent() const { return m_inspectorWorkerAgent; }
+    void setInspectorWorkerAgent(InspectorWorkerAgent* agent) { m_inspectorWorkerAgent = agent; }
+
</ins><span class="cx"> private:
</span><span class="cx">     InstrumentingAgents(Inspector::InspectorEnvironment&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -146,6 +150,7 @@
</span><span class="cx">     InspectorPageAgent* m_inspectorPageAgent { nullptr };
</span><span class="cx">     InspectorCSSAgent* m_inspectorCSSAgent { nullptr };
</span><span class="cx">     InspectorLayerTreeAgent* m_inspectorLayerTreeAgent { nullptr };
</span><ins>+    InspectorWorkerAgent* m_inspectorWorkerAgent { nullptr };
</ins><span class="cx">     WebConsoleAgent* m_webConsoleAgent { nullptr };
</span><span class="cx">     InspectorDOMAgent* m_inspectorDOMAgent { nullptr };
</span><span class="cx">     InspectorNetworkAgent* m_inspectorNetworkAgent { nullptr };
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorWorkerInspectorControllercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/inspector/WorkerInspectorController.cpp (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/WorkerInspectorController.cpp	                        (rev 0)
+++ trunk/Source/WebCore/inspector/WorkerInspectorController.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,118 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WorkerInspectorController.h&quot;
+
+#include &quot;InstrumentingAgents.h&quot;
+#include &quot;JSMainThreadExecState.h&quot;
+#include &quot;WebInjectedScriptHost.h&quot;
+#include &quot;WebInjectedScriptManager.h&quot;
+#include &quot;WorkerGlobalScope.h&quot;
+#include &quot;WorkerThread.h&quot;
+#include &quot;WorkerToPageFrontendChannel.h&quot;
+#include &lt;inspector/InspectorAgentBase.h&gt;
+#include &lt;inspector/InspectorBackendDispatcher.h&gt;
+#include &lt;inspector/InspectorFrontendChannel.h&gt;
+#include &lt;inspector/InspectorFrontendDispatchers.h&gt;
+#include &lt;inspector/InspectorFrontendRouter.h&gt;
+
+using namespace JSC;
+using namespace Inspector;
+
+namespace WebCore {
+
+WorkerInspectorController::WorkerInspectorController(WorkerGlobalScope&amp; workerGlobalScope)
+    : m_instrumentingAgents(InstrumentingAgents::create(*this))
+    , m_injectedScriptManager(std::make_unique&lt;WebInjectedScriptManager&gt;(*this, WebInjectedScriptHost::create()))
+    , m_frontendRouter(FrontendRouter::create())
+    , m_backendDispatcher(BackendDispatcher::create(m_frontendRouter.copyRef()))
+    , m_executionStopwatch(Stopwatch::create())
+    , m_scriptDebugServer(workerGlobalScope)
+    , m_workerGlobalScope(workerGlobalScope)
+{
+    // FIXME: RuntimeAgent
+    // FIXME: ConsoleAgent
+    // FIXME: DebuggerAgent
+}
+
+WorkerInspectorController::~WorkerInspectorController()
+{
+    ASSERT(!m_frontendRouter-&gt;hasFrontends());
+    ASSERT(!m_forwardingChannel);
+
+    m_instrumentingAgents-&gt;reset();
+}
+
+void WorkerInspectorController::workerTerminating()
+{
+    m_injectedScriptManager-&gt;disconnect();
+
+    disconnectFrontend(Inspector::DisconnectReason::InspectedTargetDestroyed);
+}
+
+void WorkerInspectorController::connectFrontend()
+{
+    ASSERT(!m_frontendRouter-&gt;hasFrontends());
+    ASSERT(!m_forwardingChannel);
+
+    m_forwardingChannel = std::make_unique&lt;WorkerToPageFrontendChannel&gt;(m_workerGlobalScope);
+    m_frontendRouter-&gt;connectFrontend(m_forwardingChannel.get());
+    m_agents.didCreateFrontendAndBackend(&amp;m_frontendRouter.get(), &amp;m_backendDispatcher.get());
+}
+
+void WorkerInspectorController::disconnectFrontend(Inspector::DisconnectReason reason)
+{
+    if (!m_frontendRouter-&gt;hasFrontends())
+        return;
+
+    ASSERT(m_forwardingChannel);
+
+    m_agents.willDestroyFrontendAndBackend(reason);
+    m_frontendRouter-&gt;disconnectFrontend(m_forwardingChannel.get());
+    m_forwardingChannel = nullptr;
+}
+
+void WorkerInspectorController::dispatchMessageFromFrontend(const String&amp; message)
+{
+    m_backendDispatcher-&gt;dispatch(message);
+}
+
+InspectorFunctionCallHandler WorkerInspectorController::functionCallHandler() const
+{
+    return WebCore::functionCallHandlerFromAnyThread;
+}
+
+InspectorEvaluateHandler WorkerInspectorController::evaluateHandler() const
+{
+    return WebCore::evaluateHandlerFromAnyThread;
+}
+
+VM&amp; WorkerInspectorController::vm()
+{
+    return m_workerGlobalScope.vm();
+}
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreinspectorWorkerInspectorControllerh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/inspector/WorkerInspectorController.h (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/WorkerInspectorController.h	                        (rev 0)
+++ trunk/Source/WebCore/inspector/WorkerInspectorController.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,84 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &quot;WorkerScriptDebugServer.h&quot;
+#include &lt;inspector/InspectorAgentRegistry.h&gt;
+#include &lt;inspector/InspectorEnvironment.h&gt;
+#include &lt;wtf/Forward.h&gt;
+#include &lt;wtf/Noncopyable.h&gt;
+#include &lt;wtf/Stopwatch.h&gt;
+
+namespace Inspector {
+class FrontendChannel;
+class FrontendRouter;
+};
+
+namespace WebCore {
+
+class InstrumentingAgents;
+class WebInjectedScriptManager;
+class WorkerGlobalScope;
+
+class WorkerInspectorController final : public Inspector::InspectorEnvironment {
+    WTF_MAKE_NONCOPYABLE(WorkerInspectorController);
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    explicit WorkerInspectorController(WorkerGlobalScope&amp;);
+    virtual ~WorkerInspectorController();
+
+    void workerTerminating();
+
+    void connectFrontend();
+    void disconnectFrontend(Inspector::DisconnectReason);
+
+    void dispatchMessageFromFrontend(const String&amp;);
+
+    // InspectorEnvironment
+    bool developerExtrasEnabled() const override { return true; }
+    bool canAccessInspectedScriptState(JSC::ExecState*) const override { return true; }
+    Inspector::InspectorFunctionCallHandler functionCallHandler() const override;
+    Inspector::InspectorEvaluateHandler evaluateHandler() const override;
+    void frontendInitialized() override { }
+    Ref&lt;WTF::Stopwatch&gt; executionStopwatch() override { return m_executionStopwatch.copyRef(); }
+    WorkerScriptDebugServer&amp; scriptDebugServer() override { return m_scriptDebugServer; }
+    JSC::VM&amp; vm() override;
+
+private:
+    friend class InspectorInstrumentation;
+
+    Ref&lt;InstrumentingAgents&gt; m_instrumentingAgents;
+    std::unique_ptr&lt;WebInjectedScriptManager&gt; m_injectedScriptManager;
+    Ref&lt;Inspector::FrontendRouter&gt; m_frontendRouter;
+    Ref&lt;Inspector::BackendDispatcher&gt; m_backendDispatcher;
+    Ref&lt;WTF::Stopwatch&gt; m_executionStopwatch;
+    WorkerScriptDebugServer m_scriptDebugServer;
+    Inspector::AgentRegistry m_agents;
+    WorkerGlobalScope&amp; m_workerGlobalScope;
+    std::unique_ptr&lt;Inspector::FrontendChannel&gt; m_forwardingChannel;
+};
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreinspectorWorkerScriptDebugServercppfromrev208006trunkSourceWebCoreinspectorInstrumentingAgentscpp"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/inspector/WorkerScriptDebugServer.cpp (from rev 208006, trunk/Source/WebCore/inspector/InstrumentingAgents.cpp) (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/WorkerScriptDebugServer.cpp	                        (rev 0)
+++ trunk/Source/WebCore/inspector/WorkerScriptDebugServer.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,83 @@
</span><ins>+/*
+ * Copyright (c) 2011 Google Inc. All rights reserved.
+ * Copyright (c) 2013-2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WorkerScriptDebugServer.h&quot;
+
+#include &quot;JSDOMBinding.h&quot;
+#include &quot;Timer.h&quot;
+#include &quot;WorkerGlobalScope.h&quot;
+#include &quot;WorkerRunLoop.h&quot;
+#include &quot;WorkerThread.h&quot;
+#include &lt;runtime/VM.h&gt;
+
+using namespace Inspector;
+
+namespace WebCore {
+
+WorkerScriptDebugServer::WorkerScriptDebugServer(WorkerGlobalScope&amp; context)
+    : ScriptDebugServer(context.script()-&gt;vm())
+    , m_workerGlobalScope(context)
+{
+}
+
+void WorkerScriptDebugServer::attachDebugger()
+{
+    m_workerGlobalScope.script()-&gt;attachDebugger(this);
+}
+
+void WorkerScriptDebugServer::detachDebugger(bool isBeingDestroyed)
+{
+    if (m_workerGlobalScope.script())
+        m_workerGlobalScope.script()-&gt;detachDebugger(this);
+    if (!isBeingDestroyed)
+        recompileAllJSFunctions();
+}
+
+void WorkerScriptDebugServer::recompileAllJSFunctions()
+{
+    JSC::JSLockHolder lock(vm());
+    JSC::Debugger::recompileAllJSFunctions();
+}
+
+void WorkerScriptDebugServer::runEventLoopWhilePaused()
+{
+    TimerBase::fireTimersInNestedEventLoop();
+
+    // FIXME: Implement Worker Debugger Run Loop.
+}
+
+void WorkerScriptDebugServer::reportException(JSC::ExecState* exec, JSC::Exception* exception) const
+{
+    WebCore::reportException(exec, exception);
+}
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreinspectorWorkerScriptDebugServerhfromrev208006trunkSourceWebCoreworkersWorkerReportingProxyh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/inspector/WorkerScriptDebugServer.h (from rev 208006, trunk/Source/WebCore/workers/WorkerReportingProxy.h) (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/WorkerScriptDebugServer.h	                        (rev 0)
+++ trunk/Source/WebCore/inspector/WorkerScriptDebugServer.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+/*
+ * Copyright (c) 2011 Google Inc. All rights reserved.
+ * Copyright (c) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &lt;inspector/ScriptDebugServer.h&gt;
+
+namespace WebCore {
+
+class WorkerGlobalScope;
+
+class WorkerScriptDebugServer final : public Inspector::ScriptDebugServer {
+    WTF_MAKE_NONCOPYABLE(WorkerScriptDebugServer);
+public:
+    WorkerScriptDebugServer(WorkerGlobalScope&amp;);
+    ~WorkerScriptDebugServer() { }
+
+    void recompileAllJSFunctions() override;
+
+private:
+    void attachDebugger() override;
+    void detachDebugger(bool isBeingDestroyed) override;
+
+    void didPause(JSC::JSGlobalObject*) override { }
+    void didContinue(JSC::JSGlobalObject*) override { }
+    void runEventLoopWhilePaused() override;
+    bool isContentScript(JSC::ExecState*) const override { return false; }
+    void reportException(JSC::ExecState*, JSC::Exception*) const override;
+
+    WorkerGlobalScope&amp; m_workerGlobalScope;
+};
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreinspectorWorkerToPageFrontendChannelh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/inspector/WorkerToPageFrontendChannel.h (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/WorkerToPageFrontendChannel.h	                        (rev 0)
+++ trunk/Source/WebCore/inspector/WorkerToPageFrontendChannel.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,55 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &quot;WorkerGlobalScope.h&quot;
+#include &quot;WorkerReportingProxy.h&quot;
+#include &quot;WorkerThread.h&quot;
+#include &lt;inspector/InspectorFrontendChannel.h&gt;
+
+namespace WebCore {
+
+class WorkerToPageFrontendChannel final : public Inspector::FrontendChannel {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    explicit WorkerToPageFrontendChannel(WorkerGlobalScope&amp; workerGlobalScope)
+        : m_workerGlobalScope(workerGlobalScope)
+    {
+    }
+    ~WorkerToPageFrontendChannel() { }
+
+private:
+    ConnectionType connectionType() const override { return ConnectionType::Local; }
+
+    void sendMessageToFrontend(const String&amp; message) override
+    {
+        m_workerGlobalScope.thread().workerReportingProxy().postMessageToPageInspector(message);
+    }
+
+    WorkerGlobalScope&amp; m_workerGlobalScope;
+};
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerGlobalScopecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.cpp (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerGlobalScope.cpp	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> #include &quot;SecurityOrigin.h&quot;
</span><span class="cx"> #include &quot;SecurityOriginPolicy.h&quot;
</span><span class="cx"> #include &quot;SocketProvider.h&quot;
</span><ins>+#include &quot;WorkerInspectorController.h&quot;
</ins><span class="cx"> #include &quot;WorkerLoaderProxy.h&quot;
</span><span class="cx"> #include &quot;WorkerLocation.h&quot;
</span><span class="cx"> #include &quot;WorkerNavigator.h&quot;
</span><span class="lines">@@ -53,8 +54,9 @@
</span><span class="cx"> WorkerGlobalScope::WorkerGlobalScope(const URL&amp; url, const String&amp; userAgent, WorkerThread&amp; thread, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider)
</span><span class="cx">     : m_url(url)
</span><span class="cx">     , m_userAgent(userAgent)
</span><ins>+    , m_thread(thread)
</ins><span class="cx">     , m_script(std::make_unique&lt;WorkerScriptController&gt;(this))
</span><del>-    , m_thread(thread)
</del><ins>+    , m_inspectorController(std::make_unique&lt;WorkerInspectorController&gt;(*this))
</ins><span class="cx">     , m_shouldBypassMainWorldContentSecurityPolicy(shouldBypassMainWorldContentSecurityPolicy)
</span><span class="cx">     , m_eventQueue(*this)
</span><span class="cx">     , m_topOrigin(topOrigin)
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerGlobalScopeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.h (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerGlobalScope.h	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -43,6 +43,7 @@
</span><span class="cx"> class ContentSecurityPolicyResponseHeaders;
</span><span class="cx"> class Crypto;
</span><span class="cx"> class ScheduledAction;
</span><ins>+class WorkerInspectorController;
</ins><span class="cx"> class WorkerLocation;
</span><span class="cx"> class WorkerNavigator;
</span><span class="cx"> class WorkerThread;
</span><span class="lines">@@ -67,6 +68,8 @@
</span><span class="cx">     WorkerScriptController* script() { return m_script.get(); }
</span><span class="cx">     void clearScript() { m_script = nullptr; }
</span><span class="cx"> 
</span><ins>+    WorkerInspectorController&amp; inspectorController() const { return *m_inspectorController; }
+
</ins><span class="cx">     WorkerThread&amp; thread() const { return m_thread; }
</span><span class="cx"> 
</span><span class="cx">     using ScriptExecutionContext::hasPendingActivity;
</span><span class="lines">@@ -150,8 +153,9 @@
</span><span class="cx">     mutable RefPtr&lt;WorkerLocation&gt; m_location;
</span><span class="cx">     mutable RefPtr&lt;WorkerNavigator&gt; m_navigator;
</span><span class="cx"> 
</span><ins>+    WorkerThread&amp; m_thread;
</ins><span class="cx">     std::unique_ptr&lt;WorkerScriptController&gt; m_script;
</span><del>-    WorkerThread&amp; m_thread;
</del><ins>+    std::unique_ptr&lt;WorkerInspectorController&gt; m_inspectorController;
</ins><span class="cx"> 
</span><span class="cx">     bool m_closing { false };
</span><span class="cx">     bool m_shouldBypassMainWorldContentSecurityPolicy;
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerInspectorProxycpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/workers/WorkerInspectorProxy.cpp (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerInspectorProxy.cpp	                        (rev 0)
+++ trunk/Source/WebCore/workers/WorkerInspectorProxy.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,131 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WorkerInspectorProxy.h&quot;
+
+#include &quot;InspectorInstrumentation.h&quot;
+#include &quot;ScriptExecutionContext.h&quot;
+#include &quot;WorkerGlobalScope.h&quot;
+#include &quot;WorkerInspectorController.h&quot;
+#include &quot;WorkerThread.h&quot;
+#include &lt;inspector/IdentifiersFactory.h&gt;
+#include &lt;inspector/InspectorAgentBase.h&gt;
+#include &lt;wtf/NeverDestroyed.h&gt;
+
+using namespace Inspector;
+
+namespace WebCore {
+
+HashSet&lt;WorkerInspectorProxy*&gt;&amp; WorkerInspectorProxy::allWorkerInspectorProxies()
+{
+    static NeverDestroyed&lt;HashSet&lt;WorkerInspectorProxy*&gt;&gt; proxies;
+    return proxies;
+}
+
+WorkerInspectorProxy::WorkerInspectorProxy()
+{
+    m_identifier = &quot;worker:&quot; + IdentifiersFactory::createIdentifier();
+}
+
+WorkerInspectorProxy::~WorkerInspectorProxy()
+{
+    ASSERT(!m_workerThread);
+    ASSERT(!m_pageChannel);
+}
+
+void WorkerInspectorProxy::workerStarted(ScriptExecutionContext* scriptExecutionContext, WorkerThread* thread, const URL&amp; url)
+{
+    ASSERT(!m_workerThread);
+
+    m_scriptExecutionContext = scriptExecutionContext;
+    m_workerThread = thread;
+    m_url = url;
+
+    allWorkerInspectorProxies().add(this);
+
+    InspectorInstrumentation::workerStarted(m_scriptExecutionContext.get(), this, m_url);
+}
+
+void WorkerInspectorProxy::workerTerminated()
+{
+    if (!m_workerThread)
+        return;
+
+    InspectorInstrumentation::workerTerminated(m_scriptExecutionContext.get(), this);
+
+    allWorkerInspectorProxies().remove(this);
+
+    m_scriptExecutionContext = nullptr;
+    m_workerThread = nullptr;
+    m_pageChannel = nullptr;
+}
+
+void WorkerInspectorProxy::connectToWorkerInspectorController(PageChannel* channel)
+{
+    ASSERT(m_workerThread);
+    if (!m_workerThread)
+        return;
+
+    m_pageChannel = channel;
+
+    m_workerThread-&gt;runLoop().postTask([] (ScriptExecutionContext&amp; context) {
+        downcast&lt;WorkerGlobalScope&gt;(context).inspectorController().connectFrontend();
+    });
+}
+
+void WorkerInspectorProxy::disconnectFromWorkerInspectorController()
+{
+    ASSERT(m_workerThread);
+    if (!m_workerThread)
+        return;
+
+    m_pageChannel = nullptr;
+
+    m_workerThread-&gt;runLoop().postTask([] (ScriptExecutionContext&amp; context) {
+        downcast&lt;WorkerGlobalScope&gt;(context).inspectorController().disconnectFrontend(DisconnectReason::InspectorDestroyed);
+    });
+}
+
+void WorkerInspectorProxy::sendMessageToWorkerInspectorController(const String&amp; message)
+{
+    ASSERT(m_workerThread);
+    if (!m_workerThread)
+        return;
+
+    m_workerThread-&gt;runLoop().postTask([message = message.isolatedCopy()] (ScriptExecutionContext&amp; context) {
+        downcast&lt;WorkerGlobalScope&gt;(context).inspectorController().dispatchMessageFromFrontend(message);
+    });
+}
+
+void WorkerInspectorProxy::sendMessageFromWorkerToFrontend(const String&amp; message)
+{
+    if (!m_pageChannel)
+        return;
+
+    m_pageChannel-&gt;sendMessageFromWorkerToFrontend(this, message);
+}
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerInspectorProxyh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/workers/WorkerInspectorProxy.h (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerInspectorProxy.h	                        (rev 0)
+++ trunk/Source/WebCore/workers/WorkerInspectorProxy.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,76 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &quot;URL.h&quot;
+#include &lt;wtf/HashSet.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+// All of these methods should be called on the Main Thread.
+// Used to send messages to the WorkerInspector on the WorkerThread.
+
+namespace WebCore {
+
+class ScriptExecutionContext;
+class WorkerThread;
+
+class WorkerInspectorProxy {
+    WTF_MAKE_NONCOPYABLE(WorkerInspectorProxy);
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    WorkerInspectorProxy();
+    ~WorkerInspectorProxy();
+
+    // A Worker's inspector messages come in and go out through the Page's WorkerAgent.
+    class PageChannel {
+    public:
+        virtual ~PageChannel() { }
+        virtual void sendMessageFromWorkerToFrontend(WorkerInspectorProxy*, const String&amp;) = 0;
+    };
+
+    static HashSet&lt;WorkerInspectorProxy*&gt;&amp; allWorkerInspectorProxies();
+
+    const URL&amp; url() const { return m_url; }
+    const String&amp; identifier() const { return m_identifier; }
+    ScriptExecutionContext* scriptExecutionContext() const { return m_scriptExecutionContext.get(); }
+
+    void workerStarted(ScriptExecutionContext*, WorkerThread*, const URL&amp;);
+    void workerTerminated();
+
+    void connectToWorkerInspectorController(PageChannel*);
+    void disconnectFromWorkerInspectorController();
+    void sendMessageToWorkerInspectorController(const String&amp;);
+    void sendMessageFromWorkerToFrontend(const String&amp;);
+
+private:
+    RefPtr&lt;ScriptExecutionContext&gt; m_scriptExecutionContext;
+    RefPtr&lt;WorkerThread&gt; m_workerThread;
+    String m_identifier;
+    URL m_url;
+    PageChannel* m_pageChannel { nullptr };
+};
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerMessagingProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> #include &quot;PageGroup.h&quot;
</span><span class="cx"> #include &quot;ScriptExecutionContext.h&quot;
</span><span class="cx"> #include &quot;Worker.h&quot;
</span><ins>+#include &quot;WorkerInspectorProxy.h&quot;
</ins><span class="cx"> #include &lt;inspector/ScriptCallStack.h&gt;
</span><span class="cx"> #include &lt;runtime/ConsoleTypes.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="lines">@@ -54,6 +55,7 @@
</span><span class="cx"> 
</span><span class="cx"> WorkerMessagingProxy::WorkerMessagingProxy(Worker* workerObject)
</span><span class="cx">     : m_scriptExecutionContext(workerObject-&gt;scriptExecutionContext())
</span><ins>+    , m_inspectorProxy(std::make_unique&lt;WorkerInspectorProxy&gt;())
</ins><span class="cx">     , m_workerObject(workerObject)
</span><span class="cx">     , m_mayBeDestroyed(false)
</span><span class="cx">     , m_unconfirmedMessageCount(0)
</span><span class="lines">@@ -94,6 +96,8 @@
</span><span class="cx"> 
</span><span class="cx">     workerThreadCreated(thread);
</span><span class="cx">     thread-&gt;start();
</span><ins>+
+    m_inspectorProxy-&gt;workerStarted(m_scriptExecutionContext.get(), thread.get(), scriptURL);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerMessagingProxy::postMessageToWorkerObject(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, std::unique_ptr&lt;MessagePortChannelArray&gt; channels)
</span><span class="lines">@@ -170,6 +174,13 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WorkerMessagingProxy::postMessageToPageInspector(const String&amp; message)
+{
+    m_scriptExecutionContext-&gt;postTask([this, message = message.isolatedCopy()] (ScriptExecutionContext&amp;) {
+        m_inspectorProxy-&gt;sendMessageFromWorkerToFrontend(message);
+    });
+}
+
</ins><span class="cx"> void WorkerMessagingProxy::workerThreadCreated(PassRefPtr&lt;DedicatedWorkerThread&gt; workerThread)
</span><span class="cx"> {
</span><span class="cx">     m_workerThread = workerThread;
</span><span class="lines">@@ -234,6 +245,8 @@
</span><span class="cx">     m_askedToTerminate = true;
</span><span class="cx">     m_workerThread = nullptr;
</span><span class="cx"> 
</span><ins>+    m_inspectorProxy-&gt;workerTerminated();
+
</ins><span class="cx">     if (m_mayBeDestroyed)
</span><span class="cx">         delete this;
</span><span class="cx"> }
</span><span class="lines">@@ -244,6 +257,8 @@
</span><span class="cx">         return;
</span><span class="cx">     m_askedToTerminate = true;
</span><span class="cx"> 
</span><ins>+    m_inspectorProxy-&gt;workerTerminated();
+
</ins><span class="cx">     if (m_workerThread)
</span><span class="cx">         m_workerThread-&gt;stop();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerMessagingProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerMessagingProxy.h (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerMessagingProxy.h	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/workers/WorkerMessagingProxy.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx">     class ContentSecurityPolicyResponseHeaders;
</span><span class="cx">     class DedicatedWorkerThread;
</span><span class="cx">     class Worker;
</span><ins>+    class WorkerInspectorProxy;
</ins><span class="cx"> 
</span><span class="cx">     class WorkerMessagingProxy : public WorkerGlobalScopeProxy, public WorkerObjectProxy, public WorkerLoaderProxy {
</span><span class="cx">         WTF_MAKE_NONCOPYABLE(WorkerMessagingProxy); WTF_MAKE_FAST_ALLOCATED;
</span><span class="lines">@@ -61,6 +62,7 @@
</span><span class="cx">         void postMessageToWorkerObject(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp;, std::unique_ptr&lt;MessagePortChannelArray&gt;) override;
</span><span class="cx">         void postExceptionToWorkerObject(const String&amp; errorMessage, int lineNumber, int columnNumber, const String&amp; sourceURL) override;
</span><span class="cx">         void postConsoleMessageToWorkerObject(MessageSource, MessageLevel, const String&amp; message, int lineNumber, int columnNumber, const String&amp; sourceURL) override;
</span><ins>+        void postMessageToPageInspector(const String&amp;) override;
</ins><span class="cx">         void confirmMessageFromWorkerObject(bool hasPendingActivity) override;
</span><span class="cx">         void reportPendingActivity(bool hasPendingActivity) override;
</span><span class="cx">         void workerGlobalScopeClosed() override;
</span><span class="lines">@@ -86,6 +88,7 @@
</span><span class="cx">         Worker* workerObject() const { return m_workerObject; }
</span><span class="cx"> 
</span><span class="cx">         RefPtr&lt;ScriptExecutionContext&gt; m_scriptExecutionContext;
</span><ins>+        std::unique_ptr&lt;WorkerInspectorProxy&gt; m_inspectorProxy;
</ins><span class="cx">         Worker* m_workerObject;
</span><span class="cx">         bool m_mayBeDestroyed;
</span><span class="cx">         RefPtr&lt;DedicatedWorkerThread&gt; m_workerThread;
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerReportingProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerReportingProxy.h (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerReportingProxy.h	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/workers/WorkerReportingProxy.h	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx">         virtual void postExceptionToWorkerObject(const String&amp; errorMessage, int lineNumber, int columnNumber, const String&amp; sourceURL) = 0;
</span><span class="cx"> 
</span><span class="cx">         virtual void postConsoleMessageToWorkerObject(MessageSource, MessageLevel, const String&amp; message, int lineNumber, int columnNumber, const String&amp; sourceURL) = 0;
</span><ins>+        virtual void postMessageToPageInspector(const String&amp;) = 0;
</ins><span class="cx"> 
</span><span class="cx">         // Invoked when close() is invoked on the worker context.
</span><span class="cx">         virtual void workerGlobalScopeClosed() = 0;
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerThread.cpp (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerThread.cpp	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebCore/workers/WorkerThread.cpp	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include &quot;ThreadGlobalData.h&quot;
</span><span class="cx"> #include &quot;URL.h&quot;
</span><span class="cx"> #include &quot;WorkerGlobalScope.h&quot;
</span><ins>+#include &quot;WorkerInspectorController.h&quot;
</ins><span class="cx"> #include &lt;utility&gt;
</span><span class="cx"> #include &lt;wtf/Lock.h&gt;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="lines">@@ -218,6 +219,8 @@
</span><span class="cx"> 
</span><span class="cx">             workerGlobalScope.stopActiveDOMObjects();
</span><span class="cx"> 
</span><ins>+            workerGlobalScope.inspectorController().workerTerminating();
+
</ins><span class="cx">             // Event listeners would keep DOMWrapperWorld objects alive for too long. Also, they have references to JS objects,
</span><span class="cx">             // which become dangling once Heap is destroyed.
</span><span class="cx">             workerGlobalScope.removeAllEventListeners();
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebInspectorUI/ChangeLog	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2016-10-27  Joseph Pecoraro  &lt;pecoraro at apple.com&gt;
+
+        Web Inspector: Introduce Page WorkerAgent and Worker InspectorController
+        https://bugs.webkit.org/show_bug.cgi?id=163817
+        &lt;rdar://problem/28899063&gt;
+
+        Reviewed by Brian Burg.
+
+        * UserInterface/Main.html:
+        * UserInterface/Test.html:
+        New files.
+
+        * UserInterface/Base/Main.js:
+        (WebInspector.loaded):
+        * UserInterface/Test/Test.js:
+        (WebInspector.loaded):
+        New Observers and Managers.
+
+        * UserInterface/Protocol/WorkerObserver.js: Added.
+        (WebInspector.WorkerObserver.prototype.workerCreated):
+        (WebInspector.WorkerObserver.prototype.workerTerminated):
+        (WebInspector.WorkerObserver.prototype.dispatchMessageFromWorker):
+        (WebInspector.WorkerObserver):
+        * UserInterface/Controllers/WorkerManager.js: Added.
+        (WebInspector.WorkerManager):
+        (WebInspector.WorkerManager.prototype.workerCreated):
+        (WebInspector.WorkerManager.prototype.workerTerminated):
+        (WebInspector.WorkerManager.prototype.dispatchMessageFromWorker):
+        To be implemented with the first Worker agent implementation
+        when there is actually something we can do with the Worker.
+
</ins><span class="cx"> 2016-10-25  Joseph Pecoraro  &lt;pecoraro at apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Cmd-+ doesn't &quot;zoom in&quot; to increase text size in the Web Inspector
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceBaseMainjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Base/Main.js (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Base/Main.js	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebInspectorUI/UserInterface/Base/Main.js	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -88,6 +88,8 @@
</span><span class="cx">         InspectorBackend.registerLayerTreeDispatcher(new WebInspector.LayerTreeObserver);
</span><span class="cx">     if (InspectorBackend.registerRuntimeDispatcher)
</span><span class="cx">         InspectorBackend.registerRuntimeDispatcher(new WebInspector.RuntimeObserver);
</span><ins>+    if (InspectorBackend.registerWorkerDispatcher)
+        InspectorBackend.registerWorkerDispatcher(new WebInspector.WorkerObserver);
</ins><span class="cx">     if (InspectorBackend.registerReplayDispatcher)
</span><span class="cx">         InspectorBackend.registerReplayDispatcher(new WebInspector.ReplayObserver);
</span><span class="cx"> 
</span><span class="lines">@@ -121,6 +123,7 @@
</span><span class="cx">     this.layerTreeManager = new WebInspector.LayerTreeManager;
</span><span class="cx">     this.dashboardManager = new WebInspector.DashboardManager;
</span><span class="cx">     this.probeManager = new WebInspector.ProbeManager;
</span><ins>+    this.workerManager = new WebInspector.WorkerManager;
</ins><span class="cx">     this.replayManager = new WebInspector.ReplayManager;
</span><span class="cx"> 
</span><span class="cx">     // Enable the Console Agent after creating the singleton managers.
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersWorkerManagerjs"></a>
<div class="addfile"><h4>Added: trunk/Source/WebInspectorUI/UserInterface/Controllers/WorkerManager.js (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/WorkerManager.js	                        (rev 0)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/WorkerManager.js	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,52 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.WorkerManager = class WorkerManager extends WebInspector.Object
+{
+    constructor()
+    {
+        super();
+
+        if (window.WorkerAgent)
+            WorkerAgent.enable();
+    }
+
+    // Public
+
+    workerCreated(workerId, url)
+    {
+        // FIXME: Create Target.
+    }
+
+    workerTerminated(workerId)
+    {
+        // FIXME: Remove Target.
+    }
+
+    dispatchMessageFromWorker(workerId, message)
+    {
+        // FIXME: Dispatch on Target.
+    }
+};
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceMainhtml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Main.html (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Main.html	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebInspectorUI/UserInterface/Main.html	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -271,6 +271,7 @@
</span><span class="cx">     &lt;script src=&quot;Protocol/RuntimeObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/ScriptProfilerObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/TimelineObserver.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Protocol/WorkerObserver.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx"> 
</span><span class="cx">     &lt;script src=&quot;Models/BreakpointAction.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/ConsoleMessage.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -716,6 +717,7 @@
</span><span class="cx">     &lt;script src=&quot;Controllers/TimelineManager.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/TypeTokenAnnotator.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/VisualStyleCompletionsController.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Controllers/WorkerManager.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx"> 
</span><span class="cx">     &lt;script src=&quot;Workers/Formatter/FormatterContentBuilder.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceProtocolWorkerObserverjs"></a>
<div class="addfile"><h4>Added: trunk/Source/WebInspectorUI/UserInterface/Protocol/WorkerObserver.js (0 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Protocol/WorkerObserver.js	                        (rev 0)
+++ trunk/Source/WebInspectorUI/UserInterface/Protocol/WorkerObserver.js	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.WorkerObserver = class WorkerObserver
+{
+    // Events defined by the &quot;Worker&quot; domain.
+
+    workerCreated(workerId, url)
+    {
+        WebInspector.workerManager.workerCreated(workerId, url);
+    }
+
+    workerTerminated(workerId)
+    {
+        WebInspector.workerManager.workerTerminated(workerId);
+    }
+
+    dispatchMessageFromWorker(workerId, message)
+    {
+        WebInspector.workerManager.dispatchMessageFromWorker(workerId, message);
+    }
+};
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceTestTestjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Test/Test.js (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Test/Test.js	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebInspectorUI/UserInterface/Test/Test.js	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -46,6 +46,7 @@
</span><span class="cx">     InspectorBackend.registerTimelineDispatcher(new WebInspector.TimelineObserver);
</span><span class="cx">     InspectorBackend.registerCSSDispatcher(new WebInspector.CSSObserver);
</span><span class="cx">     InspectorBackend.registerRuntimeDispatcher(new WebInspector.RuntimeObserver);
</span><ins>+    InspectorBackend.registerWorkerDispatcher(new WebInspector.WorkerObserver);
</ins><span class="cx">     if (InspectorBackend.registerReplayDispatcher)
</span><span class="cx">         InspectorBackend.registerReplayDispatcher(new WebInspector.ReplayObserver);
</span><span class="cx"> 
</span><span class="lines">@@ -62,6 +63,7 @@
</span><span class="cx">     this.timelineManager = new WebInspector.TimelineManager;
</span><span class="cx">     this.debuggerManager = new WebInspector.DebuggerManager;
</span><span class="cx">     this.probeManager = new WebInspector.ProbeManager;
</span><ins>+    this.workerManager = new WebInspector.WorkerManager;
</ins><span class="cx">     this.replayManager = new WebInspector.ReplayManager;
</span><span class="cx"> 
</span><span class="cx">     document.addEventListener(&quot;DOMContentLoaded&quot;, this.contentLoaded);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceTesthtml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Test.html (208007 => 208008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Test.html	2016-10-27 22:18:49 UTC (rev 208007)
+++ trunk/Source/WebInspectorUI/UserInterface/Test.html	2016-10-27 22:18:55 UTC (rev 208008)
</span><span class="lines">@@ -77,6 +77,7 @@
</span><span class="cx">     &lt;script src=&quot;Protocol/ReplayObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/RuntimeObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/TimelineObserver.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Protocol/WorkerObserver.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx"> 
</span><span class="cx">     &lt;script src=&quot;Models/BreakpointAction.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/ConsoleMessage.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -184,6 +185,7 @@
</span><span class="cx">     &lt;script src=&quot;Controllers/RuntimeManager.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/StorageManager.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/TimelineManager.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Controllers/WorkerManager.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx"> 
</span><span class="cx">     &lt;script src=&quot;Controllers/Formatter.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/ResourceQueryController.js&quot;&gt;&lt;/script&gt;
</span></span></pre>
</div>
</div>

</body>
</html>


More information about the webkit-changes mailing list