<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[208520] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/208520">208520</a></dd>
<dt>Author</dt> <dd>joepeck@webkit.org</dd>
<dt>Date</dt> <dd>2016-11-09 19:54:06 -0800 (Wed, 09 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: Associate Worker Resources with the Worker and not the Page
https://bugs.webkit.org/show_bug.cgi?id=164342
&lt;rdar://problem/29075775&gt;

Reviewed by Timothy Hatcher.

Source/JavaScriptCore:

* inspector/protocol/Network.json:
* inspector/protocol/Page.json:
Associate Resource data with a target.

Source/WebCore:

Test: inspector/worker/resources-in-worker.html

Provide a way to associate an initiator identifier with a ResourceRequest.
This will allow Web Inspector to identify who started particular resource
loads. This is important to associate Worker(...), importScript(...), and
XMLHttpRequest / Fetch loads with that specific Worker.

* platform/network/ResourceRequestBase.cpp:
(WebCore::ResourceRequestBase::setAsIsolatedCopy):
* platform/network/ResourceRequestBase.h:
(WebCore::ResourceRequestBase::initiatorIdentifier):
(WebCore::ResourceRequestBase::setInitiatorIdentifier):
Optional initiator identifier. Currently used only be Web Inspector.

* dom/ScriptExecutionContext.h:
(WebCore::ScriptExecutionContext::resourceRequestIdentifier):
Non-page execution contexts, like WorkerGlobalScope, should provide
a unique identifier that may be used to distinguish loads initiated
from within that context.

* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::createRequest):
* Modules/fetch/FetchLoader.cpp:
(WebCore::FetchLoader::start):
* Modules/fetch/FetchRequest.cpp:
(WebCore::FetchRequest::initializeWith):
XHR / Fetch loads should include the ScriptExecutionContext's
initiator identifier.

* workers/WorkerScriptLoader.cpp:
(WebCore::WorkerScriptLoader::WorkerScriptLoader):
(WebCore::WorkerScriptLoader::loadSynchronously):
(WebCore::WorkerScriptLoader::loadAsynchronously):
(WebCore::WorkerScriptLoader::createResourceRequest):
* workers/WorkerScriptLoader.h:
Provide a way to provide initiator identifier information for
Worker script loads. Currently this is `new Worker(...)` and
`importScripts(...)` resource loads.

* workers/Worker.cpp:
(WebCore::Worker::Worker):
(WebCore::Worker::create):
* workers/Worker.h:
* workers/WorkerGlobalScope.cpp:
(WebCore::WorkerGlobalScope::WorkerGlobalScope):
(WebCore::WorkerGlobalScope::importScripts):
* workers/WorkerGlobalScope.h:
Give Worker itself the unique identifier, because `new Worker(...)`
loads happen before the WorkerGlobalScript (ScriptExecutionContext)
is actually created, but we want to associate it with this Worker.

* workers/DedicatedWorkerGlobalScope.cpp:
(WebCore::DedicatedWorkerGlobalScope::create):
(WebCore::DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope):
* workers/DedicatedWorkerGlobalScope.h:
* workers/DedicatedWorkerThread.cpp:
(WebCore::DedicatedWorkerThread::DedicatedWorkerThread):
(WebCore::DedicatedWorkerThread::createWorkerGlobalScope):
* workers/DedicatedWorkerThread.h:
* workers/WorkerInspectorProxy.cpp:
(WebCore::WorkerInspectorProxy::WorkerInspectorProxy):
* workers/WorkerInspectorProxy.h:
* workers/WorkerMessagingProxy.cpp:
(WebCore::WorkerMessagingProxy::WorkerMessagingProxy):
(WebCore::WorkerMessagingProxy::startWorkerGlobalScope):
* workers/WorkerThread.cpp:
(WebCore::WorkerThreadStartupData::WorkerThreadStartupData):
(WebCore::WorkerThread::WorkerThread):
(WebCore::WorkerThread::workerThread):
* workers/WorkerThread.h:
Pass the MainThread's Worker identifier through to the WorkerGlobalScope
created on the WorkerThread. They should be the same identifier.

* inspector/InspectorNetworkAgent.cpp:
(WebCore::InspectorNetworkAgent::willSendRequest):
* inspector/InspectorPageAgent.cpp:
(WebCore::InspectorPageAgent::buildObjectForFrameTree):
Pass the initiator identifier data to the frontend. This identifier is
equivalent to a &quot;target identifier&quot; in the frontend. Currently the only
non-Page targets are Workers.

* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::shouldContinueAfterNotifyingLoadedFromMemoryCache):
When using the memory cache we create a new resource request. Be sure
to copy over useful inspector data, like the initiator identifier,
from the original request.

* platform/network/cf/ResourceRequestCFNet.cpp:
(WebCore::ResourceRequest::updateFromDelegatePreservingOldProperties):
When rebuilding a ResourceRequest from NSURLRequest, copy over the
initiator identifier property that wouldn't otherwise have survived
the transition.

Source/WebInspectorUI:

A Target may have its own list of Resource. For example, Workers may
request any resources via XHR/Fetch. So we associate a ResourceCollection
with a Target, and ensure we show them in Web Inspector as you would expect.
At this point, Target starts acting like Frame. Target has a resourceCollection
and extraScriptsCollection just like Frame. Target has events for ResourceAdded
just like Frame.

Even though Resource loads are happening in Workers, the Network data
still comes from the Page's Network agent. The added &quot;targetId&quot; data
with the Resource will let us associate a Resoure with a Target.

When opening inspector after a page has loaded, the frontend loads Resources
via the Page.getResourceTree path. In this case, the frontend may be
informed of Resources for a Target that it does not know about yet. In
these cases, it sets them aside as Orphaned resources for a target. Later,
when that Target is created, it will adopt its Orphaned resources.

Places that used to listen to just Frame.Event.ResourceWasAdded should now
also listen for Target.Event.ResourceAdded to ensure it sees the resources
associated with non-page targets.

* UserInterface/Protocol/Target.js:
(WebInspector.Target):
(WebInspector.Target.prototype.get identifier):
(WebInspector.Target.prototype.get resourceCollection):
(WebInspector.Target.prototype.get extraScriptCollection):
(WebInspector.Target.prototype.addResource):
(WebInspector.Target.prototype.adoptResource):
(WebInspector.Target.prototype.addScript):
Give Target resource collections.

(WebInspector.MainTarget):
(WebInspector.MainTarget.prototype.get mainResource):
Pass through to the FrameResourceManager for the MainTarget.

(WebInspector.WorkerTarget):
(WebInspector.WorkerTarget.prototype.initialize):
Adopt orphaned resources on creation.

* UserInterface/Models/Resource.js:
(WebInspector.Resource):
(WebInspector.Resource.prototype.get target):
(WebInspector.Resource.prototype.get type):
Resource now has a Target. During creation, if there is a targetId
then we must produce a Target or null (orphaned).

(WebInspector.Resource.prototype.associateWithScript):
When associating a Resource with a Script, we can use this opportunity
to convert from an XML / Other type to Script.

* UserInterface/Models/Script.js:
(WebInspector.Script.prototype._resolveResource):
When associating Scripts with a resource we must associate resources
from within the proper Target. If it is the Main target we still use
the FrameResourceManager which keep searches across all Frames.

* UserInterface/Protocol/NetworkObserver.js:
(WebInspector.NetworkObserver.prototype.requestWillBeSent):
* UserInterface/Controllers/FrameResourceManager.js:
(WebInspector.FrameResourceManager.prototype.initialize):
(WebInspector.FrameResourceManager.prototype.frameDidNavigate):
(WebInspector.FrameResourceManager.prototype.resourceRequestWillBeSent):
(WebInspector.FrameResourceManager.prototype.resourceRequestWasServedFromMemoryCache):
(WebInspector.FrameResourceManager.prototype.resourceRequestDidReceiveResponse):
(WebInspector.FrameResourceManager.prototype.adoptOrphanedResourcesForTarget):
(WebInspector.FrameResourceManager.prototype._addNewResourceToFrameOrTarget):
(WebInspector.FrameResourceManager.prototype._addResourceToTarget):
(WebInspector.FrameResourceManager.prototype._createResource):
(WebInspector.FrameResourceManager.prototype._addFrameTreeFromFrameResourceTreePayload):
(WebInspector.FrameResourceManager.prototype._addOrphanedResource):
(WebInspector.FrameResourceManager.prototype._mainFrameDidChange):
(WebInspector.FrameResourceManager.prototype._addNewResourceToFrame): Deleted.
When creating Resources from Network events we may now have a targetId.
Once created a Resource must be associated with a Frame, Target, or orphaned.

* UserInterface/Main.html:
* UserInterface/Views/TargetTreeElement.js: Removed.
* UserInterface/Views/WorkerTreeElement.js: Added.
(WebInspector.WorkerTreeElement):
(WebInspector.WorkerTreeElement.prototype.get target):
(WebInspector.WorkerTreeElement.prototype.onexpand):
(WebInspector.WorkerTreeElement.prototype.oncollapse):
(WebInspector.WorkerTreeElement.prototype.onpopulate):
(WebInspector.WorkerTreeElement.prototype.updateSourceMapResources):
(WebInspector.WorkerTreeElement.prototype.onattach):
(WebInspector.WorkerTreeElement.prototype.compareChildTreeElements):
(WebInspector.WorkerTreeElement.prototype._handleContextMenuEvent):
(WebInspector.WorkerTreeElement.prototype._scriptAdded):
(WebInspector.WorkerTreeElement.prototype._resourceAdded):
Convert TargetTreeElement to WorkerTreeElement as that is clearer.
Behave like FrameTreeElement and populate resources on creation,
handle SourceMapResource, etc.

* UserInterface/Views/FolderizedTreeElement.js:
(WebInspector.FolderizedTreeElement.prototype.registerFolderizeSettings):
(WebInspector.FolderizedTreeElement.prototype._compareTreeElementsByMainTitle):
(WebInspector.FolderizedTreeElement.prototype._parentTreeElementForRepresentedObject):
If the display name for a folder is `null` then there is no folder,
and place such child tree elements at the top level. This will be
the case for a Worker's Script's, which we choose not to folderize.

* UserInterface/Controllers/DebuggerManager.js:
(WebInspector.DebuggerManager.prototype.scriptDidParse):
* UserInterface/Controllers/TargetManager.js:
(WebInspector.TargetManager.prototype.targetForIdentifier):

* UserInterface/Models/DefaultDashboard.js:
(WebInspector.DefaultDashboard):
* UserInterface/Controllers/TimelineManager.js:
(WebInspector.TimelineManager):
* UserInterface/Controllers/WorkerManager.js:
(WebInspector.WorkerManager.prototype.workerCreated):
* UserInterface/Views/OpenResourceDialog.js:
(WebInspector.OpenResourceDialog.prototype.didDismissDialog):
(WebInspector.OpenResourceDialog.prototype.didPresentDialog):
(WebInspector.OpenResourceDialog.prototype._addScriptsForTarget): Deleted.
(WebInspector.OpenResourceDialog.prototype._addResourcesForTarget): Added.
Ensure those that listen for Frame.Event.ResourceWasAdded now also
listen for Target.Event.ResourceAdded.

* UserInterface/Views/ContextMenuUtilities.js:
(WebInspector.appendContextMenuItemsForSourceCode):
(WebInspector.appendContextMenuItemsForResource): Deleted.
* UserInterface/Views/ResourceTimelineDataGridNode.js:
(WebInspector.ResourceTimelineDataGridNode.prototype.appendContextMenuItems):
* UserInterface/Views/ResourceTreeElement.js:
(WebInspector.ResourceTreeElement.prototype._updateTitles):
(WebInspector.ResourceTreeElement.prototype._handleContextMenuEvent):
Generalize ContextMenu helper to SourceCode so it can be used on a Script or Resource.

* UserInterface/Views/ResourceDetailsSidebarPanel.js:
(WebInspector.ResourceDetailsSidebarPanel.prototype.inspect):
When looking at a WorkerTarget's mainResource (Script) show the
Resource Details sidebar for its Resource.

* UserInterface/Views/ResourceSidebarPanel.js:
(WebInspector.ResourceSidebarPanel):
(WebInspector.ResourceSidebarPanel.prototype._scriptWasAdded):
(WebInspector.ResourceSidebarPanel.prototype._scriptsCleared):
(WebInspector.ResourceSidebarPanel.prototype._addTargetWithMainResource):
(WebInspector.ResourceSidebarPanel.prototype._targetRemoved):
(WebInspector.ResourceSidebarPanel.prototype._addScriptForNonMainTarget): Deleted.
Simplify ResourceSidebarPanel to only handle adding WorkerTreeElements,
which will do the rest of the work for their Resources/Scripts.

* UserInterface/Views/SourceCodeTreeElement.js:
(WebInspector.SourceCodeTreeElement.prototype.descendantResourceTreeElementTypeDidChange):
When we were changing the type of a resource, it would remove and re-insert.
This would collapse the parent if it was the only child in removal, and not
expand the parent when re-inserting. This ensures we re-expand.

LayoutTests:

* inspector/worker/resources-in-worker-expected.txt: Added.
* inspector/worker/resources-in-worker.html: Added.
* inspector/worker/resources/dataFetch.json: Added.
* inspector/worker/resources/dataXHR.json: Added.
* inspector/worker/resources/resource-utilities.js: Added.
(loadResourceXHR):
(loadResourceFetch):
* inspector/worker/resources/worker-resources.js: Added.
(importScript):
(onmessage):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorprotocolNetworkjson">trunk/Source/JavaScriptCore/inspector/protocol/Network.json</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorprotocolPagejson">trunk/Source/JavaScriptCore/inspector/protocol/Page.json</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchLoadercpp">trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchRequestcpp">trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp</a></li>
<li><a href="#trunkSourceWebCoredomScriptExecutionContexth">trunk/Source/WebCore/dom/ScriptExecutionContext.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorNetworkAgentcpp">trunk/Source/WebCore/inspector/InspectorNetworkAgent.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorPageAgentcpp">trunk/Source/WebCore/inspector/InspectorPageAgent.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedResourceLoadercpp">trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceRequestBasecpp">trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceRequestBaseh">trunk/Source/WebCore/platform/network/ResourceRequestBase.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcfResourceRequestCFNetcpp">trunk/Source/WebCore/platform/network/cf/ResourceRequestCFNet.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersDedicatedWorkerGlobalScopecpp">trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersDedicatedWorkerGlobalScopeh">trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.h</a></li>
<li><a href="#trunkSourceWebCoreworkersDedicatedWorkerThreadcpp">trunk/Source/WebCore/workers/DedicatedWorkerThread.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersDedicatedWorkerThreadh">trunk/Source/WebCore/workers/DedicatedWorkerThread.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkercpp">trunk/Source/WebCore/workers/Worker.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerh">trunk/Source/WebCore/workers/Worker.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="#trunkSourceWebCoreworkersWorkerInspectorProxycpp">trunk/Source/WebCore/workers/WorkerInspectorProxy.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerInspectorProxyh">trunk/Source/WebCore/workers/WorkerInspectorProxy.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerMessagingProxycpp">trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerScriptLoadercpp">trunk/Source/WebCore/workers/WorkerScriptLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerScriptLoaderh">trunk/Source/WebCore/workers/WorkerScriptLoader.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerThreadcpp">trunk/Source/WebCore/workers/WorkerThread.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerThreadh">trunk/Source/WebCore/workers/WorkerThread.h</a></li>
<li><a href="#trunkSourceWebCorexmlXMLHttpRequestcpp">trunk/Source/WebCore/xml/XMLHttpRequest.cpp</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersDebuggerManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/DebuggerManager.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersFrameResourceManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/FrameResourceManager.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersTargetManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/TargetManager.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersTimelineManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersWorkerManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/WorkerManager.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceMainhtml">trunk/Source/WebInspectorUI/UserInterface/Main.html</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsDefaultDashboardjs">trunk/Source/WebInspectorUI/UserInterface/Models/DefaultDashboard.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsResourcejs">trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsScriptjs">trunk/Source/WebInspectorUI/UserInterface/Models/Script.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceProtocolNetworkObserverjs">trunk/Source/WebInspectorUI/UserInterface/Protocol/NetworkObserver.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceProtocolTargetjs">trunk/Source/WebInspectorUI/UserInterface/Protocol/Target.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsContextMenuUtilitiesjs">trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsDebuggerSidebarPaneljs">trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsFolderizedTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/FolderizedTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsOpenResourceDialogjs">trunk/Source/WebInspectorUI/UserInterface/Views/OpenResourceDialog.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsResourceDetailsSidebarPaneljs">trunk/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsResourceSidebarPaneljs">trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsResourceTimelineDataGridNodejs">trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTimelineDataGridNode.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsResourceTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTreeElement.js</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsinspectorworkerresourcesdataFetchjson">trunk/LayoutTests/inspector/worker/resources/dataFetch.json</a></li>
<li><a href="#trunkLayoutTestsinspectorworkerresourcesdataXHRjson">trunk/LayoutTests/inspector/worker/resources/dataXHR.json</a></li>
<li><a href="#trunkLayoutTestsinspectorworkerresourcesresourceutilitiesjs">trunk/LayoutTests/inspector/worker/resources/resource-utilities.js</a></li>
<li><a href="#trunkLayoutTestsinspectorworkerresourcesworkerresourcesjs">trunk/LayoutTests/inspector/worker/resources/worker-resources.js</a></li>
<li><a href="#trunkLayoutTestsinspectorworkerresourcesinworkerexpectedtxt">trunk/LayoutTests/inspector/worker/resources-in-worker-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectorworkerresourcesinworkerhtml">trunk/LayoutTests/inspector/worker/resources-in-worker.html</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsWorkerTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/WorkerTreeElement.js</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTargetTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/TargetTreeElement.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/LayoutTests/ChangeLog        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2016-11-09  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Associate Worker Resources with the Worker and not the Page
+        https://bugs.webkit.org/show_bug.cgi?id=164342
+        &lt;rdar://problem/29075775&gt;
+
+        Reviewed by Timothy Hatcher.
+
+        * inspector/worker/resources-in-worker-expected.txt: Added.
+        * inspector/worker/resources-in-worker.html: Added.
+        * inspector/worker/resources/dataFetch.json: Added.
+        * inspector/worker/resources/dataXHR.json: Added.
+        * inspector/worker/resources/resource-utilities.js: Added.
+        (loadResourceXHR):
+        (loadResourceFetch):
+        * inspector/worker/resources/worker-resources.js: Added.
+        (importScript):
+        (onmessage):
+
</ins><span class="cx"> 2016-11-09  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Windows localStorage tests will fail until Bug 155185 is fixed.
</span></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerresourcesdataFetchjson"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/resources/dataFetch.json (0 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/resources/dataFetch.json                                (rev 0)
+++ trunk/LayoutTests/inspector/worker/resources/dataFetch.json        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+{&quot;webkit&quot;:true, &quot;type&quot;:&quot;Fetch&quot;}
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerresourcesdataXHRjson"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/resources/dataXHR.json (0 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/resources/dataXHR.json                                (rev 0)
+++ trunk/LayoutTests/inspector/worker/resources/dataXHR.json        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+{&quot;webkit&quot;:true, &quot;type&quot;:&quot;XHR&quot;}
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerresourcesresourceutilitiesjs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/resources/resource-utilities.js (0 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/resources/resource-utilities.js                                (rev 0)
+++ trunk/LayoutTests/inspector/worker/resources/resource-utilities.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+function loadResourceXHR() {
+    let xhr = new XMLHttpRequest;
+    xhr.open(&quot;GET&quot;, &quot;dataXHR.json&quot;, true);
+    xhr.send();
+}
+
+function loadResourceFetch() {
+    fetch(&quot;dataFetch.json&quot;);
+}
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerresourcesworkerresourcesjs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/resources/worker-resources.js (0 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/resources/worker-resources.js                                (rev 0)
+++ trunk/LayoutTests/inspector/worker/resources/worker-resources.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+importScripts(&quot;resource-utilities.js&quot;);
+
+function importScript() {
+    importScripts(&quot;worker-import-1.js&quot;);
+}
+
+onmessage = function(event) {
+    if (event.data === &quot;loadResourceXHR&quot;)
+        loadResourceXHR();
+    else if (event.data === &quot;loadResourceFetch&quot;)
+        loadResourceFetch();
+    else if (event.data === &quot;importScript&quot;)
+        importScript();
+}
+
+postMessage(&quot;ready&quot;);
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerresourcesinworkerexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/resources-in-worker-expected.txt (0 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/resources-in-worker-expected.txt                                (rev 0)
+++ trunk/LayoutTests/inspector/worker/resources-in-worker-expected.txt        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -0,0 +1,63 @@
</span><ins>+Test for Resources in a Worker.
+
+
+== Running test suite: Worker.Resources
+-- Running test case: Worker.Resource.Start
+PASS: Added Target should have Worker type.
+
+-- Running test case: Worker.Resource.XHR
+PASS: Worker Target should have 1 resource.
+PASS: Worker Target should dispatch ResourceAdded event.
+PASS: Resource should be XHR.
+PASS: Resource should be tied to the Worker Target.
+PASS: Resource has no parent frame.
+PASS: Worker Target should have 2 resources.
+RESOURCES:
+inspector/worker/resources/resource-utilities.js
+inspector/worker/resources/dataXHR.json
+
+-- Running test case: Main.Resource.XHR
+PASS: Worker Target should still have 2 resources.
+PASS: Frame should dispatch ResourceWasAdded event.
+PASS: Resource should be XHR.
+PASS: Resource should be tied to the Main Target.
+PASS: Resource parentFrame is the main frame.
+PASS: Worker Target should still have 2 resources.
+RESOURCES:
+inspector/worker/resources/resource-utilities.js
+inspector/worker/resources/dataXHR.json
+
+-- Running test case: Worker.Resource.Fetch
+PASS: Worker Target should have 2 resources.
+PASS: Worker Target should dispatch ResourceAdded event.
+PASS: Resource should be tied to the Worker Target.
+PASS: Resource has no parent frame.
+PASS: Worker Target should have 3 resources.
+RESOURCES:
+inspector/worker/resources/resource-utilities.js
+inspector/worker/resources/dataXHR.json
+inspector/worker/resources/dataFetch.json
+
+-- Running test case: Main.Resource.Fetch
+PASS: Worker Target should still have 3 resources.
+PASS: Frame should dispatch ResourceWasAdded event.
+PASS: Resource should be tied to the Main Target.
+PASS: Resource parentFrame is the main frame.
+PASS: Worker Target should still have 3 resources.
+RESOURCES:
+inspector/worker/resources/resource-utilities.js
+inspector/worker/resources/dataXHR.json
+inspector/worker/resources/dataFetch.json
+
+-- Running test case: Worker.Resource.ImportScript
+PASS: Worker Target should still have 3 resources.
+PASS: Worker Target should dispatch ResourceAdded event.
+PASS: Resource should be tied to the Worker Target.
+PASS: Resource has no parent frame.
+PASS: Worker Target should have 4 resources.
+RESOURCES:
+inspector/worker/resources/resource-utilities.js
+inspector/worker/resources/dataXHR.json
+inspector/worker/resources/dataFetch.json
+inspector/worker/resources/worker-import-1.js
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorworkerresourcesinworkerhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/worker/resources-in-worker.html (0 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/worker/resources-in-worker.html                                (rev 0)
+++ trunk/LayoutTests/inspector/worker/resources-in-worker.html        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -0,0 +1,183 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../http/tests/inspector/resources/inspector-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/resource-utilities.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+let worker = null;
+
+function triggerWorkerStart() {
+    worker = new Worker(&quot;resources/worker-resources.js&quot;);
+    worker.onmessage = (event) =&gt; {
+        if (event.data === &quot;ready&quot;)
+            TestPage.dispatchEventToFrontend(&quot;WorkerIsReady&quot;);
+    }
+}
+
+function triggerMainResourceLoadXHR() {
+    loadResourceXHR();
+}
+
+function triggerWorkerResourceLoadXHR() {
+    worker.postMessage(&quot;loadResourceXHR&quot;);
+}
+
+function triggerMainResourceLoadFetch() {
+    loadResourceFetch();
+}
+
+function triggerWorkerResourceLoadFetch() {
+    worker.postMessage(&quot;loadResourceFetch&quot;);
+}
+
+function triggerWorkerImportScript() {
+    worker.postMessage(&quot;importScript&quot;);
+}
+
+function test()
+{
+    InspectorTest.debug();
+
+    let workerTarget = null;
+    let mainTarget = WebInspector.mainTarget;
+
+    function sanitizeURL(url) {
+        return url.replace(/^.*?LayoutTests\//, &quot;&quot;);
+    }
+
+    function dumpWorkerResources() {
+        InspectorTest.log(&quot;RESOURCES:&quot;);
+        for (let resource of workerTarget.resourceCollection.items)
+            InspectorTest.log(sanitizeURL(resource.url));
+        if (!workerTarget.resourceCollection.items.size)
+            InspectorTest.log(&quot;-- No Resources --&quot;);
+    }
+
+    let suite = InspectorTest.createAsyncSuite(&quot;Worker.Resources&quot;);
+
+    suite.addTestCase({
+        name: &quot;Worker.Resource.Start&quot;,
+        description: &quot;Start the worker.&quot;,
+        test(resolve, reject) {
+            InspectorTest.evaluateInPage(&quot;triggerWorkerStart()&quot;);
+
+            WebInspector.targetManager.singleFireEventListener(WebInspector.TargetManager.Event.TargetAdded, (event) =&gt; {
+                workerTarget = event.data.target;
+                InspectorTest.assert(workerTarget instanceof WebInspector.Target);
+                InspectorTest.expectEqual(workerTarget.type, WebInspector.Target.Type.Worker, &quot;Added Target should have Worker type.&quot;);
+            });
+
+            InspectorTest.singleFireEventListener(&quot;WorkerIsReady&quot;, () =&gt; {
+                resolve();
+            });
+        }
+    });
+
+    suite.addTestCase({
+        name: &quot;Worker.Resource.XHR&quot;,
+        description: &quot;Worker XHRs are tied to the Worker Target.&quot;,
+        test(resolve, reject) {
+            InspectorTest.expectEqual(workerTarget.resourceCollection.items.size, 1, &quot;Worker Target should have 1 resource.&quot;);
+            InspectorTest.evaluateInPage(&quot;triggerWorkerResourceLoadXHR()&quot;);
+            workerTarget.awaitEvent(WebInspector.Target.Event.ResourceAdded)
+                .then((event) =&gt; {
+                    let resource = event.data.resource;
+                    InspectorTest.expectThat(resource instanceof WebInspector.Resource, &quot;Worker Target should dispatch ResourceAdded event.&quot;);
+                    InspectorTest.expectEqual(resource.type, WebInspector.Resource.Type.XHR, &quot;Resource should be XHR.&quot;);
+                    InspectorTest.expectEqual(resource.target, workerTarget, &quot;Resource should be tied to the Worker Target.&quot;);
+                    InspectorTest.expectNull(resource.parentFrame, &quot;Resource has no parent frame.&quot;);
+                    InspectorTest.expectEqual(workerTarget.resourceCollection.items.size, 2, &quot;Worker Target should have 2 resources.&quot;);
+                    dumpWorkerResources();
+                    resolve();
+                }).catch(reject);
+        }
+    });
+
+    suite.addTestCase({
+        name: &quot;Main.Resource.XHR&quot;,
+        description: &quot;Main XHRs are tied to the Main Target and not affect the Worker Target&quot;,
+        test(resolve, reject) {
+            InspectorTest.evaluateInPage(&quot;triggerMainResourceLoadXHR()&quot;);
+            InspectorTest.expectEqual(workerTarget.resourceCollection.items.size, 2, &quot;Worker Target should still have 2 resources.&quot;);
+            WebInspector.Frame.awaitEvent(WebInspector.Frame.Event.ResourceWasAdded)
+                .then((event) =&gt; {
+                    let resource = event.data.resource;
+                    InspectorTest.expectThat(resource instanceof WebInspector.Resource, &quot;Frame should dispatch ResourceWasAdded event.&quot;);
+                    InspectorTest.expectEqual(resource.type, WebInspector.Resource.Type.XHR, &quot;Resource should be XHR.&quot;);
+                    InspectorTest.expectEqual(resource.target, mainTarget, &quot;Resource should be tied to the Main Target.&quot;);
+                    InspectorTest.expectEqual(resource.parentFrame, WebInspector.frameResourceManager.mainFrame, &quot;Resource parentFrame is the main frame.&quot;);
+                    InspectorTest.expectEqual(workerTarget.resourceCollection.items.size, 2, &quot;Worker Target should still have 2 resources.&quot;);
+                    dumpWorkerResources();
+                    resolve();
+                }).catch(reject);
+        }
+    });
+
+    suite.addTestCase({
+        name: &quot;Worker.Resource.Fetch&quot;,
+        description: &quot;Worker fetch requests are tied to the Worker Target.&quot;,
+        test(resolve, reject) {
+            InspectorTest.expectEqual(workerTarget.resourceCollection.items.size, 2, &quot;Worker Target should have 2 resources.&quot;);
+            InspectorTest.evaluateInPage(&quot;triggerWorkerResourceLoadFetch()&quot;);
+            workerTarget.awaitEvent(WebInspector.Target.Event.ResourceAdded)
+                .then((event) =&gt; {
+                    let resource = event.data.resource;
+                    InspectorTest.expectThat(resource instanceof WebInspector.Resource, &quot;Worker Target should dispatch ResourceAdded event.&quot;);
+                    // FIXME: Add resource type for Fetch that is not XHR?
+                    InspectorTest.expectEqual(resource.target, workerTarget, &quot;Resource should be tied to the Worker Target.&quot;);
+                    InspectorTest.expectNull(resource.parentFrame, &quot;Resource has no parent frame.&quot;);
+                    InspectorTest.expectEqual(workerTarget.resourceCollection.items.size, 3, &quot;Worker Target should have 3 resources.&quot;);
+                    dumpWorkerResources();
+                    resolve();
+                }).catch(reject);
+        }
+    });
+
+    suite.addTestCase({
+        name: &quot;Main.Resource.Fetch&quot;,
+        description: &quot;Main fetch requests are tied to the Main Target and not affect the Worker Target&quot;,
+        test(resolve, reject) {
+            InspectorTest.evaluateInPage(&quot;triggerMainResourceLoadFetch()&quot;);
+            InspectorTest.expectEqual(workerTarget.resourceCollection.items.size, 3, &quot;Worker Target should still have 3 resources.&quot;);
+            WebInspector.Frame.awaitEvent(WebInspector.Frame.Event.ResourceWasAdded)
+                .then((event) =&gt; {
+                    let resource = event.data.resource;
+                    InspectorTest.expectThat(resource instanceof WebInspector.Resource, &quot;Frame should dispatch ResourceWasAdded event.&quot;);
+                    // FIXME: Add resource type for Fetch that is not XHR?
+                    InspectorTest.expectEqual(resource.target, mainTarget, &quot;Resource should be tied to the Main Target.&quot;);
+                    InspectorTest.expectEqual(resource.parentFrame, WebInspector.frameResourceManager.mainFrame, &quot;Resource parentFrame is the main frame.&quot;);
+                    InspectorTest.expectEqual(workerTarget.resourceCollection.items.size, 3, &quot;Worker Target should still have 3 resources.&quot;);
+                    dumpWorkerResources();
+                    resolve();
+                }).catch(reject);
+        }
+    });
+
+    suite.addTestCase({
+        name: &quot;Worker.Resource.ImportScript&quot;,
+        description: &quot;Worker imported scripts are Resources tied to the Worker Target.&quot;,
+        test(resolve, reject) {
+            InspectorTest.expectEqual(workerTarget.resourceCollection.items.size, 3, &quot;Worker Target should still have 3 resources.&quot;);
+            InspectorTest.evaluateInPage(&quot;triggerWorkerImportScript()&quot;);
+            workerTarget.awaitEvent(WebInspector.Target.Event.ResourceAdded)
+                .then((event) =&gt; {
+                    let resource = event.data.resource;
+                    InspectorTest.expectThat(resource instanceof WebInspector.Resource, &quot;Worker Target should dispatch ResourceAdded event.&quot;);
+                    // FIXME: &lt;https://webkit.org/b/164425&gt; Worker Script Loads (new Worker(...), importScripts(...)) should be classified as Scripts not Raw requests
+                    InspectorTest.expectEqual(resource.target, workerTarget, &quot;Resource should be tied to the Worker Target.&quot;);
+                    InspectorTest.expectNull(resource.parentFrame, &quot;Resource has no parent frame.&quot;);
+                    InspectorTest.expectEqual(workerTarget.resourceCollection.items.size, 4, &quot;Worker Target should have 4 resources.&quot;);
+                    dumpWorkerResources();
+                    resolve();
+                }).catch(reject);
+        }
+    });
+
+    suite.runTestCasesAndFinish();
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;runTest()&quot;&gt;
+&lt;p&gt;Test for Resources in a Worker.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2016-11-09  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Associate Worker Resources with the Worker and not the Page
+        https://bugs.webkit.org/show_bug.cgi?id=164342
+        &lt;rdar://problem/29075775&gt;
+
+        Reviewed by Timothy Hatcher.
+
+        * inspector/protocol/Network.json:
+        * inspector/protocol/Page.json:
+        Associate Resource data with a target.
+
</ins><span class="cx"> 2016-11-09  Keith Miller  &lt;keith_miller@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         jsc CLI should work with the remote inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorprotocolNetworkjson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/protocol/Network.json (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/protocol/Network.json        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/JavaScriptCore/inspector/protocol/Network.json        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -185,7 +185,8 @@
</span><span class="cx">                 { &quot;name&quot;: &quot;timestamp&quot;, &quot;$ref&quot;: &quot;Timestamp&quot;, &quot;description&quot;: &quot;Timestamp.&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;initiator&quot;, &quot;$ref&quot;: &quot;Initiator&quot;, &quot;description&quot;: &quot;Request initiator.&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;redirectResponse&quot;, &quot;optional&quot;: true, &quot;$ref&quot;: &quot;Response&quot;, &quot;description&quot;: &quot;Redirect response data.&quot; },
</span><del>-                { &quot;name&quot;: &quot;type&quot;, &quot;$ref&quot;: &quot;Page.ResourceType&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Resource type.&quot; }
</del><ins>+                { &quot;name&quot;: &quot;type&quot;, &quot;$ref&quot;: &quot;Page.ResourceType&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Resource type.&quot; },
+                { &quot;name&quot;: &quot;targetId&quot;, &quot;type&quot;: &quot;string&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Identifier for the context of where the load originated. In general this is the target identifier. For Workers this will be the workerId.&quot; }
</ins><span class="cx">             ]
</span><span class="cx">         },
</span><span class="cx">         {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorprotocolPagejson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/protocol/Page.json (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/protocol/Page.json        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/JavaScriptCore/inspector/protocol/Page.json        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -38,7 +38,8 @@
</span><span class="cx">                 { &quot;name&quot;: &quot;mimeType&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;Resource mimeType as determined by the browser.&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;failed&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;True if the resource failed to load.&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;canceled&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;True if the resource was canceled during loading.&quot; },
</span><del>-                { &quot;name&quot;: &quot;sourceMapURL&quot;, &quot;type&quot;: &quot;string&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;URL of source map associated with this resource (if any).&quot; }
</del><ins>+                { &quot;name&quot;: &quot;sourceMapURL&quot;, &quot;type&quot;: &quot;string&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;URL of source map associated with this resource (if any).&quot; },
+                { &quot;name&quot;: &quot;targetId&quot;, &quot;type&quot;: &quot;string&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Identifier for the context of where the load originated. In general this is the target identifier. For Workers this will be the workerId.&quot; }
</ins><span class="cx">             ]
</span><span class="cx">         },
</span><span class="cx">         {
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/ChangeLog        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -1,3 +1,104 @@
</span><ins>+2016-11-09  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Associate Worker Resources with the Worker and not the Page
+        https://bugs.webkit.org/show_bug.cgi?id=164342
+        &lt;rdar://problem/29075775&gt;
+
+        Reviewed by Timothy Hatcher.
+
+        Test: inspector/worker/resources-in-worker.html
+
+        Provide a way to associate an initiator identifier with a ResourceRequest.
+        This will allow Web Inspector to identify who started particular resource
+        loads. This is important to associate Worker(...), importScript(...), and
+        XMLHttpRequest / Fetch loads with that specific Worker.
+
+        * platform/network/ResourceRequestBase.cpp:
+        (WebCore::ResourceRequestBase::setAsIsolatedCopy):
+        * platform/network/ResourceRequestBase.h:
+        (WebCore::ResourceRequestBase::initiatorIdentifier):
+        (WebCore::ResourceRequestBase::setInitiatorIdentifier):
+        Optional initiator identifier. Currently used only be Web Inspector.
+
+        * dom/ScriptExecutionContext.h:
+        (WebCore::ScriptExecutionContext::resourceRequestIdentifier):
+        Non-page execution contexts, like WorkerGlobalScope, should provide
+        a unique identifier that may be used to distinguish loads initiated
+        from within that context.
+
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::createRequest):
+        * Modules/fetch/FetchLoader.cpp:
+        (WebCore::FetchLoader::start):
+        * Modules/fetch/FetchRequest.cpp:
+        (WebCore::FetchRequest::initializeWith):
+        XHR / Fetch loads should include the ScriptExecutionContext's
+        initiator identifier.
+
+        * workers/WorkerScriptLoader.cpp:
+        (WebCore::WorkerScriptLoader::WorkerScriptLoader):
+        (WebCore::WorkerScriptLoader::loadSynchronously):
+        (WebCore::WorkerScriptLoader::loadAsynchronously):
+        (WebCore::WorkerScriptLoader::createResourceRequest):
+        * workers/WorkerScriptLoader.h:
+        Provide a way to provide initiator identifier information for
+        Worker script loads. Currently this is `new Worker(...)` and
+        `importScripts(...)` resource loads.
+
+        * workers/Worker.cpp:
+        (WebCore::Worker::Worker):
+        (WebCore::Worker::create):
+        * workers/Worker.h:
+        * workers/WorkerGlobalScope.cpp:
+        (WebCore::WorkerGlobalScope::WorkerGlobalScope):
+        (WebCore::WorkerGlobalScope::importScripts):
+        * workers/WorkerGlobalScope.h:
+        Give Worker itself the unique identifier, because `new Worker(...)`
+        loads happen before the WorkerGlobalScript (ScriptExecutionContext)
+        is actually created, but we want to associate it with this Worker.
+
+        * workers/DedicatedWorkerGlobalScope.cpp:
+        (WebCore::DedicatedWorkerGlobalScope::create):
+        (WebCore::DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope):
+        * workers/DedicatedWorkerGlobalScope.h:
+        * workers/DedicatedWorkerThread.cpp:
+        (WebCore::DedicatedWorkerThread::DedicatedWorkerThread):
+        (WebCore::DedicatedWorkerThread::createWorkerGlobalScope):
+        * workers/DedicatedWorkerThread.h:
+        * workers/WorkerInspectorProxy.cpp:
+        (WebCore::WorkerInspectorProxy::WorkerInspectorProxy):
+        * workers/WorkerInspectorProxy.h:
+        * workers/WorkerMessagingProxy.cpp:
+        (WebCore::WorkerMessagingProxy::WorkerMessagingProxy):
+        (WebCore::WorkerMessagingProxy::startWorkerGlobalScope):
+        * workers/WorkerThread.cpp:
+        (WebCore::WorkerThreadStartupData::WorkerThreadStartupData):
+        (WebCore::WorkerThread::WorkerThread):
+        (WebCore::WorkerThread::workerThread):
+        * workers/WorkerThread.h:
+        Pass the MainThread's Worker identifier through to the WorkerGlobalScope
+        created on the WorkerThread. They should be the same identifier.
+
+        * inspector/InspectorNetworkAgent.cpp:
+        (WebCore::InspectorNetworkAgent::willSendRequest):
+        * inspector/InspectorPageAgent.cpp:
+        (WebCore::InspectorPageAgent::buildObjectForFrameTree):
+        Pass the initiator identifier data to the frontend. This identifier is
+        equivalent to a &quot;target identifier&quot; in the frontend. Currently the only
+        non-Page targets are Workers.
+
+        * loader/cache/CachedResourceLoader.cpp:
+        (WebCore::CachedResourceLoader::shouldContinueAfterNotifyingLoadedFromMemoryCache):
+        When using the memory cache we create a new resource request. Be sure
+        to copy over useful inspector data, like the initiator identifier,
+        from the original request.
+
+        * platform/network/cf/ResourceRequestCFNet.cpp:
+        (WebCore::ResourceRequest::updateFromDelegatePreservingOldProperties):
+        When rebuilding a ResourceRequest from NSURLRequest, copy over the
+        initiator identifier property that wouldn't otherwise have survived
+        the transition.
+
</ins><span class="cx"> 2016-11-09  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         IndexedDB 2.0: Clean up some exception ordering.
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -58,6 +58,7 @@
</span><span class="cx">     ThreadableBlobRegistry::registerBlobURL(context.securityOrigin(), urlForReading, blob.url());
</span><span class="cx"> 
</span><span class="cx">     ResourceRequest request(urlForReading);
</span><ins>+    request.setInitiatorIdentifier(context.resourceRequestIdentifier());
</ins><span class="cx">     request.setHTTPMethod(&quot;GET&quot;);
</span><span class="cx"> 
</span><span class="cx">     ThreadableLoaderOptions options;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -252,6 +252,7 @@
</span><span class="cx">     m_internalRequest.options.credentials = Credentials::Omit;
</span><span class="cx">     m_internalRequest.referrer = ASCIILiteral(&quot;client&quot;);
</span><span class="cx">     m_internalRequest.request.setURL(requestURL);
</span><ins>+    m_internalRequest.request.setInitiatorIdentifier(scriptExecutionContext()-&gt;resourceRequestIdentifier());
</ins><span class="cx"> 
</span><span class="cx">     return initializeOptions(init);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoredomScriptExecutionContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.h (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ScriptExecutionContext.h        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.h        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -92,6 +92,8 @@
</span><span class="cx">     virtual SocketProvider* socketProvider() = 0;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    virtual String resourceRequestIdentifier() const { return String(); };
+
</ins><span class="cx">     bool sanitizeScriptError(String&amp; errorMessage, int&amp; lineNumber, int&amp; columnNumber, String&amp; sourceURL, Deprecated::ScriptValue&amp; error, CachedScript* = nullptr);
</span><span class="cx">     void reportException(const String&amp; errorMessage, int lineNumber, int columnNumber, const String&amp; sourceURL, JSC::Exception*, RefPtr&lt;Inspector::ScriptCallStack&gt;&amp;&amp;, CachedScript* = nullptr);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorNetworkAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorNetworkAgent.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorNetworkAgent.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/inspector/InspectorNetworkAgent.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -309,7 +309,9 @@
</span><span class="cx">     Inspector::Protocol::Page::ResourceType resourceType = InspectorPageAgent::resourceTypeJson(type);
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Inspector::Protocol::Network::Initiator&gt; initiatorObject = buildInitiatorObject(loader.frame() ? loader.frame()-&gt;document() : nullptr);
</span><del>-    m_frontendDispatcher-&gt;requestWillBeSent(requestId, m_pageAgent-&gt;frameId(loader.frame()), m_pageAgent-&gt;loaderId(&amp;loader), loader.url().string(), buildObjectForResourceRequest(request), timestamp(), initiatorObject, buildObjectForResourceResponse(redirectResponse, nullptr), type != InspectorPageAgent::OtherResource ? &amp;resourceType : nullptr);
</del><ins>+    String targetId = request.initiatorIdentifier();
+
+    m_frontendDispatcher-&gt;requestWillBeSent(requestId, m_pageAgent-&gt;frameId(loader.frame()), m_pageAgent-&gt;loaderId(&amp;loader), loader.url().string(), buildObjectForResourceRequest(request), timestamp(), initiatorObject, buildObjectForResourceResponse(redirectResponse, nullptr), type != InspectorPageAgent::OtherResource ? &amp;resourceType : nullptr, targetId.isEmpty() ? nullptr : &amp;targetId);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorNetworkAgent::markResourceAsCached(unsigned long identifier)
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorPageAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorPageAgent.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorPageAgent.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/inspector/InspectorPageAgent.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -961,6 +961,9 @@
</span><span class="cx">         String sourceMappingURL = InspectorPageAgent::sourceMapURLForResource(cachedResource);
</span><span class="cx">         if (!sourceMappingURL.isEmpty())
</span><span class="cx">             resourceObject-&gt;setSourceMapURL(sourceMappingURL);
</span><ins>+        String targetId = cachedResource-&gt;resourceRequest().initiatorIdentifier();
+        if (!targetId.isEmpty())
+            resourceObject-&gt;setTargetId(targetId);
</ins><span class="cx">         subresources-&gt;addItem(WTFMove(resourceObject));
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -542,6 +542,7 @@
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     ResourceRequest newRequest = ResourceRequest(resource-&gt;url());
</span><ins>+    newRequest.setInitiatorIdentifier(request.resourceRequest().initiatorIdentifier());
</ins><span class="cx">     if (request.resourceRequest().hiddenFromInspector())
</span><span class="cx">         newRequest.setHiddenFromInspector(true);
</span><span class="cx">     frame()-&gt;loader().loadedResourceFromMemoryCache(resource, newRequest);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceRequestBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -65,6 +65,7 @@
</span><span class="cx">     setHTTPMethod(other.httpMethod().isolatedCopy());
</span><span class="cx">     setPriority(other.priority());
</span><span class="cx">     setRequester(other.requester());
</span><ins>+    setInitiatorIdentifier(other.initiatorIdentifier().isolatedCopy());
</ins><span class="cx"> 
</span><span class="cx">     updateResourceRequest();
</span><span class="cx">     m_httpHeaderFields = other.httpHeaderFields().isolatedCopy();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceRequestBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceRequestBase.h (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceRequestBase.h        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/platform/network/ResourceRequestBase.h        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -164,6 +164,10 @@
</span><span class="cx">     Requester requester() const { return m_requester; }
</span><span class="cx">     void setRequester(Requester requester) { m_requester = requester; }
</span><span class="cx"> 
</span><ins>+    // Who initiated the request so the Inspector can associate it with a context. E.g. a Web Worker.
+    String initiatorIdentifier() const { return m_initiatorIdentifier; }
+    void setInitiatorIdentifier(const String&amp; identifier) { m_initiatorIdentifier = identifier; }
+
</ins><span class="cx"> #if !PLATFORM(COCOA)
</span><span class="cx">     bool encodingRequiresPlatformData() const { return true; }
</span><span class="cx"> #endif
</span><span class="lines">@@ -232,6 +236,7 @@
</span><span class="cx">     bool m_ignoreForRequestCount { false };
</span><span class="cx">     ResourceLoadPriority m_priority { ResourceLoadPriority::Low };
</span><span class="cx">     Requester m_requester { Requester::Unspecified };
</span><ins>+    String m_initiatorIdentifier;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     const ResourceRequest&amp; asResourceRequest() const;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcfResourceRequestCFNetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/cf/ResourceRequestCFNet.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/cf/ResourceRequestCFNet.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/platform/network/cf/ResourceRequestCFNet.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -338,6 +338,7 @@
</span><span class="cx">     RefPtr&lt;FormData&gt; oldHTTPBody = httpBody();
</span><span class="cx">     bool isHiddenFromInspector = hiddenFromInspector();
</span><span class="cx">     auto oldRequester = requester();
</span><ins>+    auto oldInitiatorIdentifier = initiatorIdentifier();
</ins><span class="cx"> 
</span><span class="cx">     *this = delegateProvidedRequest;
</span><span class="cx"> 
</span><span class="lines">@@ -345,6 +346,7 @@
</span><span class="cx">     setHTTPBody(WTFMove(oldHTTPBody));
</span><span class="cx">     setHiddenFromInspector(isHiddenFromInspector);
</span><span class="cx">     setRequester(oldRequester);
</span><ins>+    setInitiatorIdentifier(oldInitiatorIdentifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool ResourceRequest::httpPipeliningEnabled()
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersDedicatedWorkerGlobalScopecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -41,16 +41,16 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-Ref&lt;DedicatedWorkerGlobalScope&gt; DedicatedWorkerGlobalScope::create(const URL&amp; url, const String&amp; userAgent, DedicatedWorkerThread&amp; thread, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider)
</del><ins>+Ref&lt;DedicatedWorkerGlobalScope&gt; DedicatedWorkerGlobalScope::create(const URL&amp; url, const String&amp; identifier, const String&amp; userAgent, DedicatedWorkerThread&amp; thread, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider)
</ins><span class="cx"> {
</span><del>-    auto context = adoptRef(*new DedicatedWorkerGlobalScope(url, userAgent, thread, shouldBypassMainWorldContentSecurityPolicy, WTFMove(topOrigin), connectionProxy, socketProvider));
</del><ins>+    auto context = adoptRef(*new DedicatedWorkerGlobalScope(url, identifier, userAgent, thread, shouldBypassMainWorldContentSecurityPolicy, WTFMove(topOrigin), connectionProxy, socketProvider));
</ins><span class="cx">     if (!shouldBypassMainWorldContentSecurityPolicy)
</span><span class="cx">         context-&gt;applyContentSecurityPolicyResponseHeaders(contentSecurityPolicyResponseHeaders);
</span><span class="cx">     return context;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope(const URL&amp; url, const String&amp; userAgent, DedicatedWorkerThread&amp; thread, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider)
-    : WorkerGlobalScope(url, userAgent, thread, shouldBypassMainWorldContentSecurityPolicy, WTFMove(topOrigin), connectionProxy, socketProvider)
</del><ins>+DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope(const URL&amp; url, const String&amp; identifier, const String&amp; userAgent, DedicatedWorkerThread&amp; thread, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider)
+    : WorkerGlobalScope(url, identifier, userAgent, thread, shouldBypassMainWorldContentSecurityPolicy, WTFMove(topOrigin), connectionProxy, socketProvider)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersDedicatedWorkerGlobalScopeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.h (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.h        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.h        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx"> 
</span><span class="cx"> class DedicatedWorkerGlobalScope final : public WorkerGlobalScope {
</span><span class="cx"> public:
</span><del>-    static Ref&lt;DedicatedWorkerGlobalScope&gt; create(const URL&amp;, const String&amp; userAgent, DedicatedWorkerThread&amp;, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
</del><ins>+    static Ref&lt;DedicatedWorkerGlobalScope&gt; create(const URL&amp;, const String&amp; identifier, const String&amp; userAgent, DedicatedWorkerThread&amp;, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
</ins><span class="cx">     virtual ~DedicatedWorkerGlobalScope();
</span><span class="cx"> 
</span><span class="cx">     ExceptionOr&lt;void&gt; postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp;, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp;);
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx"> private:
</span><span class="cx">     using Base = WorkerGlobalScope;
</span><span class="cx"> 
</span><del>-    DedicatedWorkerGlobalScope(const URL&amp;, const String&amp; userAgent, DedicatedWorkerThread&amp;, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
</del><ins>+    DedicatedWorkerGlobalScope(const URL&amp;, const String&amp; identifier, const String&amp; userAgent, DedicatedWorkerThread&amp;, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
</ins><span class="cx"> 
</span><span class="cx">     bool isDedicatedWorkerGlobalScope() const final { return true; }
</span><span class="cx">     ExceptionOr&lt;void&gt; importScripts(const Vector&lt;String&gt;&amp; urls) final;
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersDedicatedWorkerThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/DedicatedWorkerThread.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/DedicatedWorkerThread.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/DedicatedWorkerThread.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -38,8 +38,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-DedicatedWorkerThread::DedicatedWorkerThread(const URL&amp; url, const String&amp; userAgent, const String&amp; sourceCode, WorkerLoaderProxy&amp; workerLoaderProxy, WorkerObjectProxy&amp; workerObjectProxy, WorkerThreadStartMode startMode, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider, JSC::RuntimeFlags runtimeFlags)
-    : WorkerThread(url, userAgent, sourceCode, workerLoaderProxy, workerObjectProxy, startMode, contentSecurityPolicyResponseHeaders, shouldBypassMainWorldContentSecurityPolicy, topOrigin, connectionProxy, socketProvider, runtimeFlags)
</del><ins>+DedicatedWorkerThread::DedicatedWorkerThread(const URL&amp; url, const String&amp; identifier, const String&amp; userAgent, const String&amp; sourceCode, WorkerLoaderProxy&amp; workerLoaderProxy, WorkerObjectProxy&amp; workerObjectProxy, WorkerThreadStartMode startMode, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider, JSC::RuntimeFlags runtimeFlags)
+    : WorkerThread(url, identifier, userAgent, sourceCode, workerLoaderProxy, workerObjectProxy, startMode, contentSecurityPolicyResponseHeaders, shouldBypassMainWorldContentSecurityPolicy, topOrigin, connectionProxy, socketProvider, runtimeFlags)
</ins><span class="cx">     , m_workerObjectProxy(workerObjectProxy)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -48,9 +48,9 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;WorkerGlobalScope&gt; DedicatedWorkerThread::createWorkerGlobalScope(const URL&amp; url, const String&amp; userAgent, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, PassRefPtr&lt;SecurityOrigin&gt; topOrigin)
</del><ins>+Ref&lt;WorkerGlobalScope&gt; DedicatedWorkerThread::createWorkerGlobalScope(const URL&amp; url, const String&amp; identifier, const String&amp; userAgent, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, PassRefPtr&lt;SecurityOrigin&gt; topOrigin)
</ins><span class="cx"> {
</span><del>-    return DedicatedWorkerGlobalScope::create(url, userAgent, *this, contentSecurityPolicyResponseHeaders, shouldBypassMainWorldContentSecurityPolicy, topOrigin, idbConnectionProxy(), socketProvider());
</del><ins>+    return DedicatedWorkerGlobalScope::create(url, identifier, userAgent, *this, contentSecurityPolicyResponseHeaders, shouldBypassMainWorldContentSecurityPolicy, topOrigin, idbConnectionProxy(), socketProvider());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DedicatedWorkerThread::runEventLoop()
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersDedicatedWorkerThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/DedicatedWorkerThread.h (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/DedicatedWorkerThread.h        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/DedicatedWorkerThread.h        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -49,11 +49,11 @@
</span><span class="cx">     WorkerObjectProxy&amp; workerObjectProxy() const { return m_workerObjectProxy; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    Ref&lt;WorkerGlobalScope&gt; createWorkerGlobalScope(const URL&amp;, const String&amp; userAgent, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, PassRefPtr&lt;SecurityOrigin&gt; topOrigin) override;
</del><ins>+    Ref&lt;WorkerGlobalScope&gt; createWorkerGlobalScope(const URL&amp;, const String&amp; identifier, const String&amp; userAgent, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, PassRefPtr&lt;SecurityOrigin&gt; topOrigin) override;
</ins><span class="cx">     void runEventLoop() override;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    DedicatedWorkerThread(const URL&amp;, const String&amp; userAgent, const String&amp; sourceCode, WorkerLoaderProxy&amp;, WorkerObjectProxy&amp;, WorkerThreadStartMode, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*, JSC::RuntimeFlags);
</del><ins>+    DedicatedWorkerThread(const URL&amp;, const String&amp; identifier, const String&amp; userAgent, const String&amp; sourceCode, WorkerLoaderProxy&amp;, WorkerObjectProxy&amp;, WorkerThreadStartMode, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*, JSC::RuntimeFlags);
</ins><span class="cx"> 
</span><span class="cx">     WorkerObjectProxy&amp; m_workerObjectProxy;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/Worker.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/Worker.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/Worker.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> #include &quot;WorkerGlobalScopeProxy.h&quot;
</span><span class="cx"> #include &quot;WorkerScriptLoader.h&quot;
</span><span class="cx"> #include &quot;WorkerThread.h&quot;
</span><ins>+#include &lt;inspector/IdentifiersFactory.h&gt;
</ins><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -53,6 +54,7 @@
</span><span class="cx"> 
</span><span class="cx"> inline Worker::Worker(ScriptExecutionContext&amp; context, JSC::RuntimeFlags runtimeFlags)
</span><span class="cx">     : ActiveDOMObject(&amp;context)
</span><ins>+    , m_identifier(&quot;worker:&quot; + Inspector::IdentifiersFactory::createIdentifier())
</ins><span class="cx">     , m_contextProxy(WorkerGlobalScopeProxy::create(this))
</span><span class="cx">     , m_runtimeFlags(runtimeFlags)
</span><span class="cx"> {
</span><span class="lines">@@ -88,7 +90,7 @@
</span><span class="cx"> 
</span><span class="cx">     worker-&gt;m_scriptLoader = WorkerScriptLoader::create();
</span><span class="cx">     auto contentSecurityPolicyEnforcement = shouldBypassMainWorldContentSecurityPolicy ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceChildSrcDirective;
</span><del>-    worker-&gt;m_scriptLoader-&gt;loadAsynchronously(&amp;context, scriptURL.releaseReturnValue(), FetchOptions::Mode::SameOrigin, contentSecurityPolicyEnforcement, worker.ptr());
</del><ins>+    worker-&gt;m_scriptLoader-&gt;loadAsynchronously(&amp;context, scriptURL.releaseReturnValue(), FetchOptions::Mode::SameOrigin, contentSecurityPolicyEnforcement, worker-&gt;m_identifier, worker.ptr());
</ins><span class="cx">     return WTFMove(worker);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/Worker.h (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/Worker.h        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/Worker.h        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -52,6 +52,8 @@
</span><span class="cx"> 
</span><span class="cx">     bool hasPendingActivity() const final;
</span><span class="cx"> 
</span><ins>+    String identifier() const { return m_identifier; }
+
</ins><span class="cx">     ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -71,6 +73,7 @@
</span><span class="cx">     friend void networkStateChanged(bool isOnLine);
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;WorkerScriptLoader&gt; m_scriptLoader;
</span><ins>+    String m_identifier;
</ins><span class="cx">     WorkerGlobalScopeProxy* m_contextProxy; // The proxy outlives the worker to perform thread shutdown.
</span><span class="cx">     Optional&lt;ContentSecurityPolicyResponseHeaders&gt; m_contentSecurityPolicyResponseHeaders;
</span><span class="cx">     bool m_shouldBypassMainWorldContentSecurityPolicy { false };
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerGlobalScopecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerGlobalScope.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -52,8 +52,9 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-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)
</del><ins>+WorkerGlobalScope::WorkerGlobalScope(const URL&amp; url, const String&amp; identifier, const String&amp; userAgent, WorkerThread&amp; thread, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider)
</ins><span class="cx">     : m_url(url)
</span><ins>+    , m_identifier(identifier)
</ins><span class="cx">     , m_userAgent(userAgent)
</span><span class="cx">     , m_thread(thread)
</span><span class="cx">     , m_script(std::make_unique&lt;WorkerScriptController&gt;(this))
</span><span class="lines">@@ -224,7 +225,7 @@
</span><span class="cx">             return Exception { NETWORK_ERR };
</span><span class="cx"> 
</span><span class="cx">         auto scriptLoader = WorkerScriptLoader::create();
</span><del>-        scriptLoader-&gt;loadSynchronously(this, url, FetchOptions::Mode::NoCors, shouldBypassMainWorldContentSecurityPolicy ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceScriptSrcDirective);
</del><ins>+        scriptLoader-&gt;loadSynchronously(this, url, FetchOptions::Mode::NoCors, shouldBypassMainWorldContentSecurityPolicy ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceScriptSrcDirective, resourceRequestIdentifier());
</ins><span class="cx"> 
</span><span class="cx">         // If the fetching attempt failed, throw a NETWORK_ERR exception and abort all these steps.
</span><span class="cx">         if (scriptLoader-&gt;failed())
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerGlobalScopeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.h (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerGlobalScope.h        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.h        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -100,7 +100,7 @@
</span><span class="cx">     Crypto&amp; crypto();
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    WorkerGlobalScope(const URL&amp;, const String&amp; userAgent, WorkerThread&amp;, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
</del><ins>+    WorkerGlobalScope(const URL&amp;, const String&amp; identifier, const String&amp; userAgent, WorkerThread&amp;, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
</ins><span class="cx"> 
</span><span class="cx">     void applyContentSecurityPolicyResponseHeaders(const ContentSecurityPolicyResponseHeaders&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -123,6 +123,7 @@
</span><span class="cx">     void disableEval(const String&amp; errorMessage) final;
</span><span class="cx">     EventTarget* errorEventTarget() final;
</span><span class="cx">     WorkerEventQueue&amp; eventQueue() const final;
</span><ins>+    String resourceRequestIdentifier() const final { return m_identifier; }
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_SOCKETS)
</span><span class="cx">     SocketProvider* socketProvider() final;
</span><span class="lines">@@ -145,6 +146,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     URL m_url;
</span><ins>+    String m_identifier;
</ins><span class="cx">     String m_userAgent;
</span><span class="cx"> 
</span><span class="cx">     mutable RefPtr&lt;WorkerLocation&gt; m_location;
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerInspectorProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerInspectorProxy.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerInspectorProxy.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/WorkerInspectorProxy.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -31,7 +31,6 @@
</span><span class="cx"> #include &quot;WorkerGlobalScope.h&quot;
</span><span class="cx"> #include &quot;WorkerInspectorController.h&quot;
</span><span class="cx"> #include &quot;WorkerRunLoop.h&quot;
</span><del>-#include &lt;inspector/IdentifiersFactory.h&gt;
</del><span class="cx"> #include &lt;inspector/InspectorAgentBase.h&gt;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -45,9 +44,9 @@
</span><span class="cx">     return proxies;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WorkerInspectorProxy::WorkerInspectorProxy()
</del><ins>+WorkerInspectorProxy::WorkerInspectorProxy(const String&amp; identifier)
+    : m_identifier(identifier)
</ins><span class="cx"> {
</span><del>-    m_identifier = &quot;worker:&quot; + IdentifiersFactory::createIdentifier();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WorkerInspectorProxy::~WorkerInspectorProxy()
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerInspectorProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerInspectorProxy.h (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerInspectorProxy.h        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/WorkerInspectorProxy.h        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(WorkerInspectorProxy);
</span><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><del>-    WorkerInspectorProxy();
</del><ins>+    WorkerInspectorProxy(const String&amp; identifier);
</ins><span class="cx">     ~WorkerInspectorProxy();
</span><span class="cx"> 
</span><span class="cx">     // A Worker's inspector messages come in and go out through the Page's WorkerAgent.
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerMessagingProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx"> 
</span><span class="cx"> WorkerMessagingProxy::WorkerMessagingProxy(Worker* workerObject)
</span><span class="cx">     : m_scriptExecutionContext(workerObject-&gt;scriptExecutionContext())
</span><del>-    , m_inspectorProxy(std::make_unique&lt;WorkerInspectorProxy&gt;())
</del><ins>+    , m_inspectorProxy(std::make_unique&lt;WorkerInspectorProxy&gt;(workerObject-&gt;identifier()))
</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">@@ -80,6 +80,7 @@
</span><span class="cx">     ASSERT(m_scriptExecutionContext);
</span><span class="cx">     Document&amp; document = downcast&lt;Document&gt;(*m_scriptExecutionContext);
</span><span class="cx">     WorkerThreadStartMode startMode = m_inspectorProxy-&gt;workerStartMode(*m_scriptExecutionContext.get());
</span><ins>+    String identifier = m_inspectorProxy-&gt;identifier();
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx">     IDBClient::IDBConnectionProxy* proxy = document.idbConnectionProxy();
</span><span class="lines">@@ -93,7 +94,7 @@
</span><span class="cx">     SocketProvider* socketProvider = nullptr;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    RefPtr&lt;DedicatedWorkerThread&gt; thread = DedicatedWorkerThread::create(scriptURL, userAgent, sourceCode, *this, *this, startMode, contentSecurityPolicyResponseHeaders, shouldBypassMainWorldContentSecurityPolicy, document.topOrigin(), proxy, socketProvider, runtimeFlags);
</del><ins>+    RefPtr&lt;DedicatedWorkerThread&gt; thread = DedicatedWorkerThread::create(scriptURL, identifier, userAgent, sourceCode, *this, *this, startMode, contentSecurityPolicyResponseHeaders, shouldBypassMainWorldContentSecurityPolicy, document.topOrigin(), proxy, socketProvider, runtimeFlags);
</ins><span class="cx"> 
</span><span class="cx">     workerThreadCreated(thread);
</span><span class="cx">     thread-&gt;start();
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerScriptLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerScriptLoader.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerScriptLoader.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/WorkerScriptLoader.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -39,10 +39,6 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> WorkerScriptLoader::WorkerScriptLoader()
</span><del>-    : m_client(nullptr)
-    , m_failed(false)
-    , m_identifier(0)
-    , m_finishing(false)
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -50,13 +46,13 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerScriptLoader::loadSynchronously(ScriptExecutionContext* scriptExecutionContext, const URL&amp; url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement)
</del><ins>+void WorkerScriptLoader::loadSynchronously(ScriptExecutionContext* scriptExecutionContext, const URL&amp; url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, const String&amp; initiatorIdentifier)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(scriptExecutionContext);
</span><span class="cx"> 
</span><span class="cx">     m_url = url;
</span><span class="cx"> 
</span><del>-    std::unique_ptr&lt;ResourceRequest&gt; request(createResourceRequest());
</del><ins>+    std::unique_ptr&lt;ResourceRequest&gt; request(createResourceRequest(initiatorIdentifier));
</ins><span class="cx">     if (!request)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -74,7 +70,7 @@
</span><span class="cx">     WorkerThreadableLoader::loadResourceSynchronously(downcast&lt;WorkerGlobalScope&gt;(*scriptExecutionContext), WTFMove(*request), *this, options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerScriptLoader::loadAsynchronously(ScriptExecutionContext* scriptExecutionContext, const URL&amp; url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, WorkerScriptLoaderClient* client)
</del><ins>+void WorkerScriptLoader::loadAsynchronously(ScriptExecutionContext* scriptExecutionContext, const URL&amp; url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, const String&amp; initiatorIdentifier, WorkerScriptLoaderClient* client)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(client);
</span><span class="cx">     ASSERT(scriptExecutionContext);
</span><span class="lines">@@ -82,7 +78,7 @@
</span><span class="cx">     m_client = client;
</span><span class="cx">     m_url = url;
</span><span class="cx"> 
</span><del>-    std::unique_ptr&lt;ResourceRequest&gt; request(createResourceRequest());
</del><ins>+    std::unique_ptr&lt;ResourceRequest&gt; request(createResourceRequest(initiatorIdentifier));
</ins><span class="cx">     if (!request)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -107,10 +103,11 @@
</span><span class="cx">     return m_responseURL;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::unique_ptr&lt;ResourceRequest&gt; WorkerScriptLoader::createResourceRequest()
</del><ins>+std::unique_ptr&lt;ResourceRequest&gt; WorkerScriptLoader::createResourceRequest(const String&amp; initiatorIdentifier)
</ins><span class="cx"> {
</span><span class="cx">     auto request = std::make_unique&lt;ResourceRequest&gt;(m_url);
</span><span class="cx">     request-&gt;setHTTPMethod(ASCIILiteral(&quot;GET&quot;));
</span><ins>+    request-&gt;setInitiatorIdentifier(initiatorIdentifier);
</ins><span class="cx">     return request;
</span><span class="cx"> }
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerScriptLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerScriptLoader.h (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerScriptLoader.h        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/WorkerScriptLoader.h        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -38,7 +38,6 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-    class ResourceRequest;
</del><span class="cx">     class ResourceResponse;
</span><span class="cx">     class ScriptExecutionContext;
</span><span class="cx">     class TextResourceDecoder;
</span><span class="lines">@@ -52,8 +51,8 @@
</span><span class="cx">             return adoptRef(*new WorkerScriptLoader);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        void loadSynchronously(ScriptExecutionContext*, const URL&amp;, FetchOptions::Mode, ContentSecurityPolicyEnforcement);
-        void loadAsynchronously(ScriptExecutionContext*, const URL&amp;, FetchOptions::Mode, ContentSecurityPolicyEnforcement, WorkerScriptLoaderClient*);
</del><ins>+        void loadSynchronously(ScriptExecutionContext*, const URL&amp;, FetchOptions::Mode, ContentSecurityPolicyEnforcement, const String&amp; initiatorIdentifier);
+        void loadAsynchronously(ScriptExecutionContext*, const URL&amp;, FetchOptions::Mode, ContentSecurityPolicyEnforcement, const String&amp; initiatorIdentifier, WorkerScriptLoaderClient*);
</ins><span class="cx"> 
</span><span class="cx">         void notifyError();
</span><span class="cx"> 
</span><span class="lines">@@ -63,7 +62,7 @@
</span><span class="cx">         bool failed() const { return m_failed; }
</span><span class="cx">         unsigned long identifier() const { return m_identifier; }
</span><span class="cx"> 
</span><del>-        void didReceiveResponse(unsigned long /*identifier*/, const ResourceResponse&amp;) override;
</del><ins>+        void didReceiveResponse(unsigned long identifier, const ResourceResponse&amp;) override;
</ins><span class="cx">         void didReceiveData(const char* data, int dataLength) override;
</span><span class="cx">         void didFinishLoading(unsigned long identifier, double) override;
</span><span class="cx">         void didFail(const ResourceError&amp;) override;
</span><span class="lines">@@ -74,10 +73,10 @@
</span><span class="cx">         WorkerScriptLoader();
</span><span class="cx">         ~WorkerScriptLoader();
</span><span class="cx"> 
</span><del>-        std::unique_ptr&lt;ResourceRequest&gt; createResourceRequest();
</del><ins>+        std::unique_ptr&lt;ResourceRequest&gt; createResourceRequest(const String&amp; initiatorIdentifier);
</ins><span class="cx">         void notifyFinished();
</span><span class="cx"> 
</span><del>-        WorkerScriptLoaderClient* m_client;
</del><ins>+        WorkerScriptLoaderClient* m_client { nullptr };
</ins><span class="cx">         RefPtr&lt;ThreadableLoader&gt; m_threadableLoader;
</span><span class="cx">         String m_responseEncoding;        
</span><span class="cx">         RefPtr&lt;TextResourceDecoder&gt; m_decoder;
</span><span class="lines">@@ -84,9 +83,9 @@
</span><span class="cx">         StringBuilder m_script;
</span><span class="cx">         URL m_url;
</span><span class="cx">         URL m_responseURL;
</span><del>-        bool m_failed;
-        unsigned long m_identifier;
-        bool m_finishing;
</del><ins>+        unsigned long m_identifier { 0 };
+        bool m_failed { false };
+        bool m_finishing { false };
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerThread.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerThread.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/WorkerThread.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -72,9 +72,10 @@
</span><span class="cx"> struct WorkerThreadStartupData {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(WorkerThreadStartupData); WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><del>-    WorkerThreadStartupData(const URL&amp; scriptURL, const String&amp; userAgent, const String&amp; sourceCode, WorkerThreadStartMode, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin);
</del><ins>+    WorkerThreadStartupData(const URL&amp; scriptURL, const String&amp; identifier, const String&amp; userAgent, const String&amp; sourceCode, WorkerThreadStartMode, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin);
</ins><span class="cx"> 
</span><span class="cx">     URL m_scriptURL;
</span><ins>+    String m_identifier;
</ins><span class="cx">     String m_userAgent;
</span><span class="cx">     String m_sourceCode;
</span><span class="cx">     WorkerThreadStartMode m_startMode;
</span><span class="lines">@@ -83,8 +84,9 @@
</span><span class="cx">     RefPtr&lt;SecurityOrigin&gt; m_topOrigin;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-WorkerThreadStartupData::WorkerThreadStartupData(const URL&amp; scriptURL, const String&amp; userAgent, const String&amp; sourceCode, WorkerThreadStartMode startMode, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin)
</del><ins>+WorkerThreadStartupData::WorkerThreadStartupData(const URL&amp; scriptURL, const String&amp; identifier, const String&amp; userAgent, const String&amp; sourceCode, WorkerThreadStartMode startMode, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin)
</ins><span class="cx">     : m_scriptURL(scriptURL.isolatedCopy())
</span><ins>+    , m_identifier(identifier.isolatedCopy())
</ins><span class="cx">     , m_userAgent(userAgent.isolatedCopy())
</span><span class="cx">     , m_sourceCode(sourceCode.isolatedCopy())
</span><span class="cx">     , m_startMode(startMode)
</span><span class="lines">@@ -94,12 +96,12 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WorkerThread::WorkerThread(const URL&amp; scriptURL, const String&amp; userAgent, const String&amp; sourceCode, WorkerLoaderProxy&amp; workerLoaderProxy, WorkerReportingProxy&amp; workerReportingProxy, WorkerThreadStartMode startMode, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider, JSC::RuntimeFlags runtimeFlags)
</del><ins>+WorkerThread::WorkerThread(const URL&amp; scriptURL, const String&amp; identifier, const String&amp; userAgent, const String&amp; sourceCode, WorkerLoaderProxy&amp; workerLoaderProxy, WorkerReportingProxy&amp; workerReportingProxy, WorkerThreadStartMode startMode, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider, JSC::RuntimeFlags runtimeFlags)
</ins><span class="cx">     : m_threadID(0)
</span><span class="cx">     , m_workerLoaderProxy(workerLoaderProxy)
</span><span class="cx">     , m_workerReportingProxy(workerReportingProxy)
</span><span class="cx">     , m_runtimeFlags(runtimeFlags)
</span><del>-    , m_startupData(std::make_unique&lt;WorkerThreadStartupData&gt;(scriptURL, userAgent, sourceCode, startMode, contentSecurityPolicyResponseHeaders, shouldBypassMainWorldContentSecurityPolicy, topOrigin))
</del><ins>+    , m_startupData(std::make_unique&lt;WorkerThreadStartupData&gt;(scriptURL, identifier, userAgent, sourceCode, startMode, contentSecurityPolicyResponseHeaders, shouldBypassMainWorldContentSecurityPolicy, topOrigin))
</ins><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx">     , m_idbConnectionProxy(connectionProxy)
</span><span class="cx"> #endif
</span><span class="lines">@@ -159,7 +161,7 @@
</span><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         LockHolder lock(m_threadCreationMutex);
</span><del>-        m_workerGlobalScope = createWorkerGlobalScope(m_startupData-&gt;m_scriptURL, m_startupData-&gt;m_userAgent, m_startupData-&gt;m_contentSecurityPolicyResponseHeaders, m_startupData-&gt;m_shouldBypassMainWorldContentSecurityPolicy, WTFMove(m_startupData-&gt;m_topOrigin));
</del><ins>+        m_workerGlobalScope = createWorkerGlobalScope(m_startupData-&gt;m_scriptURL, m_startupData-&gt;m_identifier, m_startupData-&gt;m_userAgent, m_startupData-&gt;m_contentSecurityPolicyResponseHeaders, m_startupData-&gt;m_shouldBypassMainWorldContentSecurityPolicy, WTFMove(m_startupData-&gt;m_topOrigin));
</ins><span class="cx"> 
</span><span class="cx">         if (m_runLoop.terminated()) {
</span><span class="cx">             // The worker was terminated before the thread had a chance to run. Since the context didn't exist yet,
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerThread.h (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerThread.h        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/workers/WorkerThread.h        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -81,10 +81,10 @@
</span><span class="cx">     JSC::RuntimeFlags runtimeFlags() const { return m_runtimeFlags; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    WorkerThread(const URL&amp;, const String&amp; userAgent, const String&amp; sourceCode, WorkerLoaderProxy&amp;, WorkerReportingProxy&amp;, WorkerThreadStartMode, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*, JSC::RuntimeFlags);
</del><ins>+    WorkerThread(const URL&amp;, const String&amp; identifier, const String&amp; userAgent, const String&amp; sourceCode, WorkerLoaderProxy&amp;, WorkerReportingProxy&amp;, WorkerThreadStartMode, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin* topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*, JSC::RuntimeFlags);
</ins><span class="cx"> 
</span><span class="cx">     // Factory method for creating a new worker context for the thread.
</span><del>-    virtual Ref&lt;WorkerGlobalScope&gt; createWorkerGlobalScope(const URL&amp;, const String&amp; userAgent, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, PassRefPtr&lt;SecurityOrigin&gt; topOrigin) = 0;
</del><ins>+    virtual Ref&lt;WorkerGlobalScope&gt; createWorkerGlobalScope(const URL&amp;, const String&amp; identifier, const String&amp; userAgent, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, PassRefPtr&lt;SecurityOrigin&gt; topOrigin) = 0;
</ins><span class="cx"> 
</span><span class="cx">     // Executes the event loop for the worker thread. Derived classes can override to perform actions before/after entering the event loop.
</span><span class="cx">     virtual void runEventLoop();
</span></span></pre></div>
<a id="trunkSourceWebCorexmlXMLHttpRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/xml/XMLHttpRequest.cpp (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/xml/XMLHttpRequest.cpp        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebCore/xml/XMLHttpRequest.cpp        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -649,6 +649,7 @@
</span><span class="cx"> 
</span><span class="cx">     ResourceRequest request(m_url);
</span><span class="cx">     request.setRequester(ResourceRequest::Requester::XHR);
</span><ins>+    request.setInitiatorIdentifier(scriptExecutionContext()-&gt;resourceRequestIdentifier());
</ins><span class="cx">     request.setHTTPMethod(m_method);
</span><span class="cx"> 
</span><span class="cx">     if (m_requestEntityBody) {
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/ChangeLog        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -1,3 +1,162 @@
</span><ins>+2016-11-09  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Associate Worker Resources with the Worker and not the Page
+        https://bugs.webkit.org/show_bug.cgi?id=164342
+        &lt;rdar://problem/29075775&gt;
+
+        Reviewed by Timothy Hatcher.
+
+        A Target may have its own list of Resource. For example, Workers may
+        request any resources via XHR/Fetch. So we associate a ResourceCollection
+        with a Target, and ensure we show them in Web Inspector as you would expect.
+        At this point, Target starts acting like Frame. Target has a resourceCollection
+        and extraScriptsCollection just like Frame. Target has events for ResourceAdded
+        just like Frame.
+
+        Even though Resource loads are happening in Workers, the Network data
+        still comes from the Page's Network agent. The added &quot;targetId&quot; data
+        with the Resource will let us associate a Resoure with a Target.
+
+        When opening inspector after a page has loaded, the frontend loads Resources
+        via the Page.getResourceTree path. In this case, the frontend may be
+        informed of Resources for a Target that it does not know about yet. In
+        these cases, it sets them aside as Orphaned resources for a target. Later,
+        when that Target is created, it will adopt its Orphaned resources.
+
+        Places that used to listen to just Frame.Event.ResourceWasAdded should now
+        also listen for Target.Event.ResourceAdded to ensure it sees the resources
+        associated with non-page targets.
+
+        * UserInterface/Protocol/Target.js:
+        (WebInspector.Target):
+        (WebInspector.Target.prototype.get identifier):
+        (WebInspector.Target.prototype.get resourceCollection):
+        (WebInspector.Target.prototype.get extraScriptCollection):
+        (WebInspector.Target.prototype.addResource):
+        (WebInspector.Target.prototype.adoptResource):
+        (WebInspector.Target.prototype.addScript):
+        Give Target resource collections.
+
+        (WebInspector.MainTarget):
+        (WebInspector.MainTarget.prototype.get mainResource):
+        Pass through to the FrameResourceManager for the MainTarget.
+
+        (WebInspector.WorkerTarget):
+        (WebInspector.WorkerTarget.prototype.initialize):
+        Adopt orphaned resources on creation.
+
+        * UserInterface/Models/Resource.js:
+        (WebInspector.Resource):
+        (WebInspector.Resource.prototype.get target):
+        (WebInspector.Resource.prototype.get type):
+        Resource now has a Target. During creation, if there is a targetId
+        then we must produce a Target or null (orphaned).
+
+        (WebInspector.Resource.prototype.associateWithScript):
+        When associating a Resource with a Script, we can use this opportunity
+        to convert from an XML / Other type to Script.
+
+        * UserInterface/Models/Script.js:
+        (WebInspector.Script.prototype._resolveResource):
+        When associating Scripts with a resource we must associate resources
+        from within the proper Target. If it is the Main target we still use
+        the FrameResourceManager which keep searches across all Frames.
+
+        * UserInterface/Protocol/NetworkObserver.js:
+        (WebInspector.NetworkObserver.prototype.requestWillBeSent):
+        * UserInterface/Controllers/FrameResourceManager.js:
+        (WebInspector.FrameResourceManager.prototype.initialize):
+        (WebInspector.FrameResourceManager.prototype.frameDidNavigate):
+        (WebInspector.FrameResourceManager.prototype.resourceRequestWillBeSent):
+        (WebInspector.FrameResourceManager.prototype.resourceRequestWasServedFromMemoryCache):
+        (WebInspector.FrameResourceManager.prototype.resourceRequestDidReceiveResponse):
+        (WebInspector.FrameResourceManager.prototype.adoptOrphanedResourcesForTarget):
+        (WebInspector.FrameResourceManager.prototype._addNewResourceToFrameOrTarget):
+        (WebInspector.FrameResourceManager.prototype._addResourceToTarget):
+        (WebInspector.FrameResourceManager.prototype._createResource):
+        (WebInspector.FrameResourceManager.prototype._addFrameTreeFromFrameResourceTreePayload):
+        (WebInspector.FrameResourceManager.prototype._addOrphanedResource):
+        (WebInspector.FrameResourceManager.prototype._mainFrameDidChange):
+        (WebInspector.FrameResourceManager.prototype._addNewResourceToFrame): Deleted.
+        When creating Resources from Network events we may now have a targetId.
+        Once created a Resource must be associated with a Frame, Target, or orphaned.
+
+        * UserInterface/Main.html:
+        * UserInterface/Views/TargetTreeElement.js: Removed.
+        * UserInterface/Views/WorkerTreeElement.js: Added.
+        (WebInspector.WorkerTreeElement):
+        (WebInspector.WorkerTreeElement.prototype.get target):
+        (WebInspector.WorkerTreeElement.prototype.onexpand):
+        (WebInspector.WorkerTreeElement.prototype.oncollapse):
+        (WebInspector.WorkerTreeElement.prototype.onpopulate):
+        (WebInspector.WorkerTreeElement.prototype.updateSourceMapResources):
+        (WebInspector.WorkerTreeElement.prototype.onattach):
+        (WebInspector.WorkerTreeElement.prototype.compareChildTreeElements):
+        (WebInspector.WorkerTreeElement.prototype._handleContextMenuEvent):
+        (WebInspector.WorkerTreeElement.prototype._scriptAdded):
+        (WebInspector.WorkerTreeElement.prototype._resourceAdded):
+        Convert TargetTreeElement to WorkerTreeElement as that is clearer.
+        Behave like FrameTreeElement and populate resources on creation,
+        handle SourceMapResource, etc.
+
+        * UserInterface/Views/FolderizedTreeElement.js:
+        (WebInspector.FolderizedTreeElement.prototype.registerFolderizeSettings):
+        (WebInspector.FolderizedTreeElement.prototype._compareTreeElementsByMainTitle):
+        (WebInspector.FolderizedTreeElement.prototype._parentTreeElementForRepresentedObject):
+        If the display name for a folder is `null` then there is no folder,
+        and place such child tree elements at the top level. This will be
+        the case for a Worker's Script's, which we choose not to folderize.
+
+        * UserInterface/Controllers/DebuggerManager.js:
+        (WebInspector.DebuggerManager.prototype.scriptDidParse):
+        * UserInterface/Controllers/TargetManager.js:
+        (WebInspector.TargetManager.prototype.targetForIdentifier):
+
+        * UserInterface/Models/DefaultDashboard.js:
+        (WebInspector.DefaultDashboard):
+        * UserInterface/Controllers/TimelineManager.js:
+        (WebInspector.TimelineManager):
+        * UserInterface/Controllers/WorkerManager.js:
+        (WebInspector.WorkerManager.prototype.workerCreated):
+        * UserInterface/Views/OpenResourceDialog.js:
+        (WebInspector.OpenResourceDialog.prototype.didDismissDialog):
+        (WebInspector.OpenResourceDialog.prototype.didPresentDialog):
+        (WebInspector.OpenResourceDialog.prototype._addScriptsForTarget): Deleted.
+        (WebInspector.OpenResourceDialog.prototype._addResourcesForTarget): Added.
+        Ensure those that listen for Frame.Event.ResourceWasAdded now also
+        listen for Target.Event.ResourceAdded.
+
+        * UserInterface/Views/ContextMenuUtilities.js:
+        (WebInspector.appendContextMenuItemsForSourceCode):
+        (WebInspector.appendContextMenuItemsForResource): Deleted.
+        * UserInterface/Views/ResourceTimelineDataGridNode.js:
+        (WebInspector.ResourceTimelineDataGridNode.prototype.appendContextMenuItems):
+        * UserInterface/Views/ResourceTreeElement.js:
+        (WebInspector.ResourceTreeElement.prototype._updateTitles):
+        (WebInspector.ResourceTreeElement.prototype._handleContextMenuEvent):
+        Generalize ContextMenu helper to SourceCode so it can be used on a Script or Resource.
+
+        * UserInterface/Views/ResourceDetailsSidebarPanel.js:
+        (WebInspector.ResourceDetailsSidebarPanel.prototype.inspect):
+        When looking at a WorkerTarget's mainResource (Script) show the
+        Resource Details sidebar for its Resource.
+
+        * UserInterface/Views/ResourceSidebarPanel.js:
+        (WebInspector.ResourceSidebarPanel):
+        (WebInspector.ResourceSidebarPanel.prototype._scriptWasAdded):
+        (WebInspector.ResourceSidebarPanel.prototype._scriptsCleared):
+        (WebInspector.ResourceSidebarPanel.prototype._addTargetWithMainResource):
+        (WebInspector.ResourceSidebarPanel.prototype._targetRemoved):
+        (WebInspector.ResourceSidebarPanel.prototype._addScriptForNonMainTarget): Deleted.
+        Simplify ResourceSidebarPanel to only handle adding WorkerTreeElements,
+        which will do the rest of the work for their Resources/Scripts.
+
+        * UserInterface/Views/SourceCodeTreeElement.js:
+        (WebInspector.SourceCodeTreeElement.prototype.descendantResourceTreeElementTypeDidChange):
+        When we were changing the type of a resource, it would remove and re-insert.
+        This would collapse the parent if it was the only child in removal, and not
+        expand the parent when re-inserting. This ensures we re-expand.
+
</ins><span class="cx"> 2016-11-09  Nikita Vasilyev  &lt;nvasilyev@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Settings tab sections overlap each other in docked Inspector window
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersDebuggerManagerjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/DebuggerManager.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/DebuggerManager.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/DebuggerManager.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx">         this._allExceptionsBreakpoint.resolved = true;
</span><span class="cx"> 
</span><span class="cx">         this._allUncaughtExceptionsBreakpoint = new WebInspector.Breakpoint(specialBreakpointLocation, !this._allUncaughtExceptionsBreakpointEnabledSetting.value);
</span><del>-        
</del><ins>+
</ins><span class="cx">         this._assertionsBreakpoint = new WebInspector.Breakpoint(specialBreakpointLocation, !this._assertionsBreakpointEnabledSetting.value);
</span><span class="cx">         this._assertionsBreakpoint.resolved = true;
</span><span class="cx"> 
</span><span class="lines">@@ -644,13 +644,20 @@
</span><span class="cx"> 
</span><span class="cx">         let script = new WebInspector.Script(target, scriptIdentifier, new WebInspector.TextRange(startLine, startColumn, endLine, endColumn), url, isContentScript, sourceURL, sourceMapURL);
</span><span class="cx"> 
</span><del>-        if (!target.mainResource &amp;&amp; target.type === WebInspector.Target.Type.Worker) {
-            if (script.url === target.name)
</del><ins>+        targetData.addScript(script);
+
+        if (target !== WebInspector.mainTarget &amp;&amp; !target.mainResource) {
+            // FIXME: &lt;https://webkit.org/b/164427&gt; Web Inspector: WorkerTarget's mainResource should be a Resource not a Script
+            // We make the main resource of a WorkerTarget the Script instead of the Resource
+            // because the frontend may not be informed of the Resource. We should gaurantee
+            // the frontend is informed of the Resource.
+            if (script.url === target.name) {
</ins><span class="cx">                 target.mainResource = script;
</span><ins>+                if (script.resource)
+                    target.resourceCollection.remove(script.resource);
+            }
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        targetData.addScript(script);
-
</del><span class="cx">         if (isWebKitInternalScript(script.sourceURL)) {
</span><span class="cx">             this._internalWebKitScripts.push(script);
</span><span class="cx">             if (!WebInspector.isDebugUIEnabled())
</span><span class="lines">@@ -662,6 +669,9 @@
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         this.dispatchEventToListeners(WebInspector.DebuggerManager.Event.ScriptAdded, {script});
</span><ins>+
+        if (target !== WebInspector.mainTarget &amp;&amp; !script.isMainResource() &amp;&amp; !script.resource)
+            target.addScript(script);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Private
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersFrameResourceManagerjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/FrameResourceManager.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/FrameResourceManager.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/FrameResourceManager.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -48,6 +48,7 @@
</span><span class="cx">         this._frameIdentifierMap = {};
</span><span class="cx">         this._mainFrame = null;
</span><span class="cx">         this._resourceRequestIdentifierMap = {};
</span><ins>+        this._orphanedResources = new Map;
</ins><span class="cx"> 
</span><span class="cx">         if (this._mainFrame !== oldMainFrame)
</span><span class="cx">             this._mainFrameDidChange(oldMainFrame);
</span><span class="lines">@@ -91,7 +92,7 @@
</span><span class="cx">             // If the frame wasn't known before now, then the main resource was loaded instantly (about:blank, etc.)
</span><span class="cx">             // Make a new resource (which will make the frame). Mark will mark it as loaded at the end too since we
</span><span class="cx">             // don't expect any more events about the load finishing for these frames.
</span><del>-            var frameResource = this._addNewResourceToFrame(null, framePayload.id, framePayload.loaderId, framePayload.url, null, null, null, null, null, framePayload.name, framePayload.securityOrigin);
</del><ins>+            var frameResource = this._addNewResourceToFrameOrTarget(null, framePayload.id, framePayload.loaderId, framePayload.url, null, null, null, null, null, framePayload.name, framePayload.securityOrigin);
</ins><span class="cx">             frame = frameResource.parentFrame;
</span><span class="cx">             frameWasLoadedInstantly = true;
</span><span class="cx"> 
</span><span class="lines">@@ -169,7 +170,7 @@
</span><span class="cx">             this._mainFrameDidChange(oldMainFrame);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    resourceRequestWillBeSent(requestIdentifier, frameIdentifier, loaderIdentifier, request, type, redirectResponse, timestamp, initiator)
</del><ins>+    resourceRequestWillBeSent(requestIdentifier, frameIdentifier, loaderIdentifier, request, type, redirectResponse, timestamp, initiator, targetId)
</ins><span class="cx">     {
</span><span class="cx">         // Called from WebInspector.NetworkObserver.
</span><span class="cx"> 
</span><span class="lines">@@ -189,6 +190,7 @@
</span><span class="cx">         if (resource) {
</span><span class="cx">             // This is an existing request which is being redirected, update the resource.
</span><span class="cx">             console.assert(redirectResponse);
</span><ins>+            console.assert(!targetId);
</ins><span class="cx">             resource.updateForRedirectResponse(request.url, request.headers, elapsedTime);
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="lines">@@ -196,7 +198,7 @@
</span><span class="cx">         var initiatorSourceCodeLocation = this._initiatorSourceCodeLocationFromPayload(initiator);
</span><span class="cx"> 
</span><span class="cx">         // This is a new request, make a new resource and add it to the right frame.
</span><del>-        resource = this._addNewResourceToFrame(requestIdentifier, frameIdentifier, loaderIdentifier, request.url, type, request.method, request.headers, request.postData, elapsedTime, null, null, initiatorSourceCodeLocation, originalRequestWillBeSentTimestamp);
</del><ins>+        resource = this._addNewResourceToFrameOrTarget(requestIdentifier, frameIdentifier, loaderIdentifier, request.url, type, request.method, request.headers, request.postData, elapsedTime, null, null, initiatorSourceCodeLocation, originalRequestWillBeSentTimestamp, targetId);
</ins><span class="cx"> 
</span><span class="cx">         // Associate the resource with the requestIdentifier so it can be found in future loading events.
</span><span class="cx">         this._resourceRequestIdentifierMap[requestIdentifier] = resource;
</span><span class="lines">@@ -234,7 +236,7 @@
</span><span class="cx">         var elapsedTime = WebInspector.timelineManager.computeElapsedTime(timestamp);
</span><span class="cx">         var initiatorSourceCodeLocation = this._initiatorSourceCodeLocationFromPayload(initiator);
</span><span class="cx">         var response = cachedResourcePayload.response;
</span><del>-        var resource = this._addNewResourceToFrame(requestIdentifier, frameIdentifier, loaderIdentifier, cachedResourcePayload.url, cachedResourcePayload.type, &quot;GET&quot;, null, null, elapsedTime, null, null, initiatorSourceCodeLocation);
</del><ins>+        var resource = this._addNewResourceToFrameOrTarget(requestIdentifier, frameIdentifier, loaderIdentifier, cachedResourcePayload.url, cachedResourcePayload.type, &quot;GET&quot;, null, null, elapsedTime, null, null, initiatorSourceCodeLocation);
</ins><span class="cx">         resource.markAsCached();
</span><span class="cx">         resource.updateForResponse(cachedResourcePayload.url, response.mimeType, cachedResourcePayload.type, response.headers, response.status, response.statusText, elapsedTime, response.timing);
</span><span class="cx">         resource.increaseSize(cachedResourcePayload.bodySize, elapsedTime);
</span><span class="lines">@@ -279,7 +281,7 @@
</span><span class="cx">         // If we haven't found an existing Resource by now, then it is a resource that was loading when the inspector
</span><span class="cx">         // opened and we just missed the resourceRequestWillBeSent for it. So make a new resource and add it.
</span><span class="cx">         if (!resource) {
</span><del>-            resource = this._addNewResourceToFrame(requestIdentifier, frameIdentifier, loaderIdentifier, response.url, type, null, response.requestHeaders, null, elapsedTime, null, null, null);
</del><ins>+            resource = this._addNewResourceToFrameOrTarget(requestIdentifier, frameIdentifier, loaderIdentifier, response.url, type, null, response.requestHeaders, null, elapsedTime, null, null, null);
</ins><span class="cx"> 
</span><span class="cx">             // Associate the resource with the requestIdentifier so it can be found in future loading events.
</span><span class="cx">             this._resourceRequestIdentifierMap[requestIdentifier] = resource;
</span><span class="lines">@@ -387,15 +389,25 @@
</span><span class="cx">         return this._mainFrame.resourceForURL(url, true);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    adoptOrphanedResourcesForTarget(target)
+    {
+        let resources = this._orphanedResources.take(target.identifier);
+        if (!resources)
+            return;
+
+        for (let resource of resources)
+            target.adoptResource(resource);
+    }
+
</ins><span class="cx">     // Private
</span><span class="cx"> 
</span><del>-    _addNewResourceToFrame(requestIdentifier, frameIdentifier, loaderIdentifier, url, type, requestMethod, requestHeaders, requestData, elapsedTime, frameName, frameSecurityOrigin, initiatorSourceCodeLocation, originalRequestWillBeSentTimestamp)
</del><ins>+    _addNewResourceToFrameOrTarget(requestIdentifier, frameIdentifier, loaderIdentifier, url, type, requestMethod, requestHeaders, requestData, elapsedTime, frameName, frameSecurityOrigin, initiatorSourceCodeLocation, originalRequestWillBeSentTimestamp, targetId)
</ins><span class="cx">     {
</span><span class="cx">         console.assert(!this._waitingForMainFrameResourceTreePayload);
</span><span class="cx"> 
</span><del>-        var resource = null;
</del><ins>+        let resource = null;
</ins><span class="cx"> 
</span><del>-        var frame = this.frameForIdentifier(frameIdentifier);
</del><ins>+        let frame = this.frameForIdentifier(frameIdentifier);
</ins><span class="cx">         if (frame) {
</span><span class="cx">             // This is a new request for an existing frame, which might be the main resource or a new resource.
</span><span class="cx">             if (frame.mainResource.url === url &amp;&amp; frame.loaderIdentifier === loaderIdentifier)
</span><span class="lines">@@ -403,12 +415,18 @@
</span><span class="cx">             else if (frame.provisionalMainResource &amp;&amp; frame.provisionalMainResource.url === url &amp;&amp; frame.provisionalLoaderIdentifier === loaderIdentifier)
</span><span class="cx">                 resource = frame.provisionalMainResource;
</span><span class="cx">             else {
</span><del>-                resource = new WebInspector.Resource(url, null, type, loaderIdentifier, requestIdentifier, requestMethod, requestHeaders, requestData, elapsedTime, initiatorSourceCodeLocation, originalRequestWillBeSentTimestamp);
-                this._addResourceToFrame(frame, resource);
</del><ins>+                resource = new WebInspector.Resource(url, null, type, loaderIdentifier, targetId, requestIdentifier, requestMethod, requestHeaders, requestData, elapsedTime, initiatorSourceCodeLocation, originalRequestWillBeSentTimestamp);
+                if (resource.target === WebInspector.mainTarget)
+                    this._addResourceToFrame(frame, resource);
+                else if (resource.target)
+                    resource.target.addResource(resource);
+                else
+                    this._addOrphanedResource(resource, targetId);
</ins><span class="cx">             }
</span><span class="cx">         } else {
</span><span class="cx">             // This is a new request for a new frame, which is always the main resource.
</span><del>-            resource = new WebInspector.Resource(url, null, type, loaderIdentifier, requestIdentifier, requestMethod, requestHeaders, requestData, elapsedTime, initiatorSourceCodeLocation, originalRequestWillBeSentTimestamp);
</del><ins>+            console.assert(!targetId)
+            resource = new WebInspector.Resource(url, null, type, loaderIdentifier, targetId, requestIdentifier, requestMethod, requestHeaders, requestData, elapsedTime, initiatorSourceCodeLocation, originalRequestWillBeSentTimestamp);
</ins><span class="cx">             frame = new WebInspector.Frame(frameIdentifier, frameName, frameSecurityOrigin, loaderIdentifier, resource);
</span><span class="cx">             this._frameIdentifierMap[frame.id] = frame;
</span><span class="cx"> 
</span><span class="lines">@@ -448,6 +466,14 @@
</span><span class="cx">         frame.addResource(resource);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    _addResourceToTarget(target, resource)
+    {
+        console.assert(target !== WebInspector.mainTarget);
+        console.assert(resource);
+
+        target.addResource(resource);
+    }
+
</ins><span class="cx">     _initiatorSourceCodeLocationFromPayload(initiatorPayload)
</span><span class="cx">     {
</span><span class="cx">         if (!initiatorPayload)
</span><span class="lines">@@ -533,7 +559,7 @@
</span><span class="cx"> 
</span><span class="cx">     _createResource(payload, framePayload)
</span><span class="cx">     {
</span><del>-        var resource = new WebInspector.Resource(payload.url, payload.mimeType, payload.type, framePayload.loaderId);
</del><ins>+        var resource = new WebInspector.Resource(payload.url, payload.mimeType, payload.type, framePayload.loaderId, payload.targetId);
</ins><span class="cx"> 
</span><span class="cx">         if (payload.sourceMapURL)
</span><span class="cx">             WebInspector.sourceMapManager.downloadSourceMap(payload.sourceMapURL, resource.url, resource);
</span><span class="lines">@@ -560,7 +586,12 @@
</span><span class="cx">                 continue;
</span><span class="cx"> 
</span><span class="cx">             var resource = this._createResource(resourcePayload, payload);
</span><del>-            frame.addResource(resource);
</del><ins>+            if (resource.target === WebInspector.mainTarget)
+                frame.addResource(resource);
+            else if (resource.target)
+                resource.target.addResource(resource);
+            else
+                this._addOrphanedResource(resource, resourcePayload.targetId);
</ins><span class="cx"> 
</span><span class="cx">             if (resourcePayload.failed || resourcePayload.canceled)
</span><span class="cx">                 resource.markAsFailed(resourcePayload.canceled);
</span><span class="lines">@@ -573,6 +604,17 @@
</span><span class="cx">         return frame;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    _addOrphanedResource(resource, targetId)
+    {
+        let resources = this._orphanedResources.get(targetId);
+        if (!resources) {
+            resources = [];
+            this._orphanedResources.set(targetId, resources);
+        }
+
+        resources.push(resource);
+    }
+
</ins><span class="cx">     _dispatchFrameWasAddedEvent(frame)
</span><span class="cx">     {
</span><span class="cx">         this.dispatchEventToListeners(WebInspector.FrameResourceManager.Event.FrameWasAdded, {frame});
</span><span class="lines">@@ -584,6 +626,7 @@
</span><span class="cx">             oldMainFrame.unmarkAsMainFrame();
</span><span class="cx">         if (this._mainFrame)
</span><span class="cx">             this._mainFrame.markAsMainFrame();
</span><ins>+
</ins><span class="cx">         this.dispatchEventToListeners(WebInspector.FrameResourceManager.Event.MainFrameDidChange, {oldMainFrame});
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -597,5 +640,5 @@
</span><span class="cx"> WebInspector.FrameResourceManager.Event = {
</span><span class="cx">     FrameWasAdded: &quot;frame-resource-manager-frame-was-added&quot;,
</span><span class="cx">     FrameWasRemoved: &quot;frame-resource-manager-frame-was-removed&quot;,
</span><del>-    MainFrameDidChange: &quot;frame-resource-manager-main-frame-did-change&quot;
</del><ins>+    MainFrameDidChange: &quot;frame-resource-manager-main-frame-did-change&quot;,
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersTargetManagerjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/TargetManager.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/TargetManager.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/TargetManager.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -41,6 +41,19 @@
</span><span class="cx">         return this._targets;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    targetForIdentifier(targetId)
+    {
+        if (!targetId)
+            return null;
+
+        for (let target of this._targets) {
+            if (target.identifier === targetId)
+                return target;
+        }
+
+        return null;
+    }
+
</ins><span class="cx">     addTarget(target)
</span><span class="cx">     {
</span><span class="cx">         this._targets.add(target);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersTimelineManagerjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx">         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.ProvisionalLoadStarted, this._provisionalLoadStarted, this);
</span><span class="cx">         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
</span><span class="cx">         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.ResourceWasAdded, this._resourceWasAdded, this);
</span><ins>+        WebInspector.Target.addEventListener(WebInspector.Target.Event.ResourceAdded, this._resourceWasAdded, this);
</ins><span class="cx"> 
</span><span class="cx">         WebInspector.heapManager.addEventListener(WebInspector.HeapManager.Event.GarbageCollected, this._garbageCollected, this);
</span><span class="cx">         WebInspector.memoryManager.addEventListener(WebInspector.MemoryManager.Event.MemoryPressure, this._memoryPressure, this);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersWorkerManagerjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/WorkerManager.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/WorkerManager.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/WorkerManager.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -40,7 +40,7 @@
</span><span class="cx">     workerCreated(workerId, url)
</span><span class="cx">     {
</span><span class="cx">         let connection = new InspectorBackend.WorkerConnection(workerId);
</span><del>-        let workerTarget = new WebInspector.WorkerTarget(url, connection);
</del><ins>+        let workerTarget = new WebInspector.WorkerTarget(workerId, url, connection);
</ins><span class="cx">         WebInspector.targetManager.addTarget(workerTarget);
</span><span class="cx"> 
</span><span class="cx">         this._connections.set(workerId, connection);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceMainhtml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Main.html (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Main.html        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Main.html        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -646,10 +646,10 @@
</span><span class="cx">     &lt;script src=&quot;Views/StackedLineChart.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/StorageSidebarPanel.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/SyntaxHighlightingSupport.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;Views/TargetTreeElement.js&quot;&gt;&lt;/script&gt;
</del><span class="cx">     &lt;script src=&quot;Views/TextContentView.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/TextNavigationItem.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/TextResourceContentView.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Views/TextToggleButtonNavigationItem.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Views/TimelineRecordBar.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/TimelineRecordFrame.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/TimelineRecordingContentView.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -657,7 +657,6 @@
</span><span class="cx">     &lt;script src=&quot;Views/TimelineRuler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/TitleView.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/ToggleButtonNavigationItem.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;Views/TextToggleButtonNavigationItem.js&quot;&gt;&lt;/script&gt;
</del><span class="cx">     &lt;script src=&quot;Views/ToggleControlToolbarItem.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/Toolbar.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/TreeElementStatusButton.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -665,6 +664,7 @@
</span><span class="cx">     &lt;script src=&quot;Views/TypeTokenView.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/TypeTreeElement.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/TypeTreeView.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Views/WorkerTreeElement.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx"> 
</span><span class="cx">     &lt;script src=&quot;Views/VisualStyleDetailsPanel.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/VisualStylePropertyEditor.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsDefaultDashboardjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/DefaultDashboard.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/DefaultDashboard.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/DefaultDashboard.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> 
</span><span class="cx">         // Necessary events required to track load of resources.
</span><span class="cx">         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.ResourceWasAdded, this._resourceWasAdded, this);
</span><ins>+        WebInspector.Target.addEventListener(WebInspector.Target.Event.ResourceAdded, this._resourceWasAdded, this);
</ins><span class="cx">         WebInspector.frameResourceManager.addEventListener(WebInspector.FrameResourceManager.Event.FrameWasAdded, this._frameWasAdded, this);
</span><span class="cx"> 
</span><span class="cx">         // Necessary events required to track console messages.
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsResourcejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> 
</span><span class="cx"> WebInspector.Resource = class Resource extends WebInspector.SourceCode
</span><span class="cx"> {
</span><del>-    constructor(url, mimeType, type, loaderIdentifier, requestIdentifier, requestMethod, requestHeaders, requestData, requestSentTimestamp, initiatorSourceCodeLocation, originalRequestWillBeSentTimestamp)
</del><ins>+    constructor(url, mimeType, type, loaderIdentifier, targetId, requestIdentifier, requestMethod, requestHeaders, requestData, requestSentTimestamp, initiatorSourceCodeLocation, originalRequestWillBeSentTimestamp)
</ins><span class="cx">     {
</span><span class="cx">         super();
</span><span class="cx"> 
</span><span class="lines">@@ -60,6 +60,7 @@
</span><span class="cx">         this._transferSize = NaN;
</span><span class="cx">         this._cached = false;
</span><span class="cx">         this._timingData = new WebInspector.ResourceTimingData(this);
</span><ins>+        this._target = targetId ? WebInspector.targetManager.targetForIdentifier(targetId) : WebInspector.mainTarget;
</ins><span class="cx"> 
</span><span class="cx">         if (this._initiatorSourceCodeLocation &amp;&amp; this._initiatorSourceCodeLocation.sourceCode instanceof WebInspector.Resource)
</span><span class="cx">             this._initiatorSourceCodeLocation.sourceCode.addInitiatedResource(this);
</span><span class="lines">@@ -127,6 +128,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Public
</span><span class="cx"> 
</span><ins>+    get target() { return this._target; }
+    get type() { return this._type; }
</ins><span class="cx">     get timingData() { return this._timingData; }
</span><span class="cx"> 
</span><span class="cx">     get url()
</span><span class="lines">@@ -168,11 +171,6 @@
</span><span class="cx">         return this._originalRequestWillBeSentTimestamp;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    get type()
-    {
-        return this._type;
-    }
-
</del><span class="cx">     get mimeType()
</span><span class="cx">     {
</span><span class="cx">         return this._mimeType;
</span><span class="lines">@@ -672,8 +670,8 @@
</span><span class="cx"> 
</span><span class="cx">         this._scripts.push(script);
</span><span class="cx"> 
</span><del>-        if (this._type === WebInspector.Resource.Type.Other) {
-            var oldType = this._type;
</del><ins>+        if (this._type === WebInspector.Resource.Type.Other || this._type === WebInspector.Resource.Type.XHR) {
+            let oldType = this._type;
</ins><span class="cx">             this._type = WebInspector.Resource.Type.Script;
</span><span class="cx">             this.dispatchEventToListeners(WebInspector.Resource.Event.TypeDidChange, {oldType});
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsScriptjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/Script.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/Script.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/Script.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -266,36 +266,36 @@
</span><span class="cx">         if (!this._url)
</span><span class="cx">             return null;
</span><span class="cx"> 
</span><del>-        // Only associate Scripts on the Page with Resources on the Page.
</del><ins>+        let resolver = WebInspector.frameResourceManager;
</ins><span class="cx">         if (this._target !== WebInspector.mainTarget)
</span><del>-            return null;
</del><ins>+            resolver = this._target.resourceCollection;
</ins><span class="cx"> 
</span><span class="cx">         try {
</span><span class="cx">             // Try with the Script's full URL.
</span><del>-            var resource = WebInspector.frameResourceManager.resourceForURL(this.url);
</del><ins>+            let resource = resolver.resourceForURL(this._url);
</ins><span class="cx">             if (resource)
</span><span class="cx">                 return resource;
</span><span class="cx"> 
</span><span class="cx">             // Try with the Script's full decoded URL.
</span><del>-            var decodedURL = decodeURI(this._url);
</del><ins>+            let decodedURL = decodeURI(this._url);
</ins><span class="cx">             if (decodedURL !== this._url) {
</span><del>-                resource = WebInspector.frameResourceManager.resourceForURL(decodedURL);
</del><ins>+                resource = resolver.resourceForURL(decodedURL);
</ins><span class="cx">                 if (resource)
</span><span class="cx">                     return resource;
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             // Next try removing any fragment in the original URL.
</span><del>-            var urlWithoutFragment = removeURLFragment(this._url);
</del><ins>+            let urlWithoutFragment = removeURLFragment(this._url);
</ins><span class="cx">             if (urlWithoutFragment !== this._url) {
</span><del>-                resource = WebInspector.frameResourceManager.resourceForURL(urlWithoutFragment);
</del><ins>+                resource = resolver.resourceForURL(urlWithoutFragment);
</ins><span class="cx">                 if (resource)
</span><span class="cx">                     return resource;
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             // Finally try removing any fragment in the decoded URL.
</span><del>-            var decodedURLWithoutFragment = removeURLFragment(decodedURL);
</del><ins>+            let decodedURLWithoutFragment = removeURLFragment(decodedURL);
</ins><span class="cx">             if (decodedURLWithoutFragment !== decodedURL) {
</span><del>-                resource = WebInspector.frameResourceManager.resourceForURL(decodedURLWithoutFragment);
</del><ins>+                resource = resolver.resourceForURL(decodedURLWithoutFragment);
</ins><span class="cx">                 if (resource)
</span><span class="cx">                     return resource;
</span><span class="cx">             }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceProtocolNetworkObserverjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Protocol/NetworkObserver.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Protocol/NetworkObserver.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Protocol/NetworkObserver.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -27,9 +27,9 @@
</span><span class="cx"> {
</span><span class="cx">     // Events defined by the &quot;Network&quot; domain.
</span><span class="cx"> 
</span><del>-    requestWillBeSent(requestId, frameId, loaderId, documentURL, request, timestamp, initiator, redirectResponse, type)
</del><ins>+    requestWillBeSent(requestId, frameId, loaderId, documentURL, request, timestamp, initiator, redirectResponse, type, targetId)
</ins><span class="cx">     {
</span><del>-        WebInspector.frameResourceManager.resourceRequestWillBeSent(requestId, frameId, loaderId, request, type, redirectResponse, timestamp, initiator);
</del><ins>+        WebInspector.frameResourceManager.resourceRequestWillBeSent(requestId, frameId, loaderId, request, type, redirectResponse, timestamp, initiator, targetId);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     requestServedFromCache(requestId)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceProtocolTargetjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Protocol/Target.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Protocol/Target.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Protocol/Target.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -25,15 +25,18 @@
</span><span class="cx"> 
</span><span class="cx"> WebInspector.Target = class Target extends WebInspector.Object
</span><span class="cx"> {
</span><del>-    constructor(name, type, connection)
</del><ins>+    constructor(identifier, name, type, connection)
</ins><span class="cx">     {
</span><span class="cx">         super();
</span><span class="cx"> 
</span><ins>+        this._identifier = identifier;
</ins><span class="cx">         this._name = name;
</span><span class="cx">         this._type = type;
</span><span class="cx">         this._connection = connection;
</span><span class="cx">         this._executionContext = null;
</span><span class="cx">         this._mainResource = null;
</span><ins>+        this._resourceCollection = new WebInspector.ResourceCollection;
+        this._extraScriptCollection = new WebInspector.Collection(WebInspector.Collection.TypeVerifier.Script);
</ins><span class="cx"> 
</span><span class="cx">         this._connection.target = this;
</span><span class="cx"> 
</span><span class="lines">@@ -48,13 +51,38 @@
</span><span class="cx"> 
</span><span class="cx">     // Public
</span><span class="cx"> 
</span><ins>+    get identifier() { return this._identifier; }
</ins><span class="cx">     get name() { return this._name; }
</span><span class="cx">     get type() { return this._type; }
</span><span class="cx">     get connection() { return this._connection; }
</span><span class="cx">     get executionContext() { return this._executionContext; }
</span><span class="cx"> 
</span><ins>+    get resourceCollection() { return this._resourceCollection; }
+    get extraScriptCollection() { return this._extraScriptCollection; }
+
</ins><span class="cx">     get mainResource() { return this._mainResource; }
</span><span class="cx">     set mainResource(resource) { this._mainResource = resource; }
</span><ins>+
+    addResource(resource)
+    {
+        this._resourceCollection.add(resource);
+
+        this.dispatchEventToListeners(WebInspector.Target.Event.ResourceAdded, {resource});
+    }
+
+    adoptResource(resource)
+    {
+        resource._target = this;
+
+        this.addResource(resource);
+    }
+
+    addScript(script)
+    {
+        this._extraScriptCollection.add(script);
+
+        this.dispatchEventToListeners(WebInspector.Target.Event.ScriptAdded, {script});
+    }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> WebInspector.Target.Type = {
</span><span class="lines">@@ -62,11 +90,16 @@
</span><span class="cx">     Worker: Symbol(&quot;worker&quot;),
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+WebInspector.Target.Event = {
+    ResourceAdded: &quot;target-resource-added&quot;,
+    ScriptAdded: &quot;target-script-added&quot;,
+};
+
</ins><span class="cx"> WebInspector.MainTarget = class MainTarget extends WebInspector.Target
</span><span class="cx"> {
</span><span class="cx">     constructor(connection)
</span><span class="cx">     {
</span><del>-        super(&quot;&quot;, WebInspector.Target.Type.Main, InspectorBackend.mainConnection);
</del><ins>+        super(&quot;&quot;, &quot;&quot;, WebInspector.Target.Type.Main, InspectorBackend.mainConnection);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Protected (Target)
</span><span class="lines">@@ -78,6 +111,12 @@
</span><span class="cx">         return WebInspector.UIString(&quot;Main Context&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    get mainResource()
+    {
+        let mainFrame = WebInspector.frameResourceManager.mainFrame;
+        return mainFrame ? mainFrame.mainResource : null;
+    }
+
</ins><span class="cx">     initialize()
</span><span class="cx">     {
</span><span class="cx">         this._executionContext = new WebInspector.ExecutionContext(this, WebInspector.RuntimeManager.TopLevelContextExecutionIdentifier, this.displayName, true, null);
</span><span class="lines">@@ -86,9 +125,9 @@
</span><span class="cx"> 
</span><span class="cx"> WebInspector.WorkerTarget = class WorkerTarget extends WebInspector.Target
</span><span class="cx"> {
</span><del>-    constructor(name, connection)
</del><ins>+    constructor(workerId, name, connection)
</ins><span class="cx">     {
</span><del>-        super(name, WebInspector.Target.Type.Worker, connection);
</del><ins>+        super(workerId, name, WebInspector.Target.Type.Worker, connection);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Protected (Target)
</span><span class="lines">@@ -100,6 +139,8 @@
</span><span class="cx"> 
</span><span class="cx">     initialize()
</span><span class="cx">     {
</span><ins>+        WebInspector.frameResourceManager.adoptOrphanedResourcesForTarget(this);
+
</ins><span class="cx">         if (this.RuntimeAgent) {
</span><span class="cx">             this.RuntimeAgent.enable();
</span><span class="cx">             this._executionContext = new WebInspector.ExecutionContext(this, WebInspector.RuntimeManager.TopLevelContextExecutionIdentifier, this.displayName, false, null);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsContextMenuUtilitiesjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -23,38 +23,41 @@
</span><span class="cx">  * THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-WebInspector.appendContextMenuItemsForResource = function(contextMenu, resource)
</del><ins>+WebInspector.appendContextMenuItemsForSourceCode = function(contextMenu, sourceCode)
</ins><span class="cx"> {
</span><del>-
</del><span class="cx">     console.assert(contextMenu instanceof WebInspector.ContextMenu);
</span><span class="cx">     if (!(contextMenu instanceof WebInspector.ContextMenu))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    console.assert(resource instanceof WebInspector.Resource);
-    if (!(resource instanceof WebInspector.Resource))
</del><ins>+    console.assert(sourceCode instanceof WebInspector.SourceCode);
+    if (!(sourceCode instanceof WebInspector.SourceCode))
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    contextMenu.appendItem(WebInspector.UIString(&quot;Open in New Tab&quot;), () =&gt; {
-        const frame = null;
-        const alwaysOpenExternally = true;
-        WebInspector.openURL(resource.url, frame, alwaysOpenExternally);
-    });
</del><ins>+    if (sourceCode.url) {
+        contextMenu.appendItem(WebInspector.UIString(&quot;Open in New Tab&quot;), () =&gt; {
+            const frame = null;
+            const alwaysOpenExternally = true;
+            WebInspector.openURL(sourceCode.url, frame, alwaysOpenExternally);
+        });
</ins><span class="cx"> 
</span><del>-    contextMenu.appendItem(WebInspector.UIString(&quot;Copy Link Address&quot;), () =&gt; {
-        InspectorFrontendHost.copyText(resource.url);
-    });
-
-    if (resource.urlComponents.scheme !== &quot;data&quot;) {
-        contextMenu.appendItem(WebInspector.UIString(&quot;Copy as cURL&quot;), () =&gt; {
-            resource.generateCURLCommand();
</del><ins>+        contextMenu.appendItem(WebInspector.UIString(&quot;Copy Link Address&quot;), () =&gt; {
+            InspectorFrontendHost.copyText(sourceCode.url);
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (sourceCode instanceof WebInspector.Resource) {
+        if (sourceCode.urlComponents.scheme !== &quot;data&quot;) {
+            contextMenu.appendItem(WebInspector.UIString(&quot;Copy as cURL&quot;), () =&gt; {
+                sourceCode.generateCURLCommand();
+            });
+        }
+    }
+
</ins><span class="cx">     contextMenu.appendItem(WebInspector.UIString(&quot;Save File&quot;), () =&gt; {
</span><del>-        resource.requestContent().then(() =&gt; {
</del><ins>+        sourceCode.requestContent().then(() =&gt; {
</ins><span class="cx">             WebInspector.saveDataToFile({
</span><del>-                url: resource.url,
-                content: resource.content
</del><ins>+                url: sourceCode.url || &quot;&quot;,
+                content: sourceCode.content
</ins><span class="cx">             });
</span><span class="cx">         });
</span><span class="cx">     });
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsDebuggerSidebarPaneljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> 
</span><span class="cx">         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
</span><span class="cx">         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.ResourceWasAdded, this._resourceAdded, this);
</span><ins>+        WebInspector.Target.addEventListener(WebInspector.Target.Event.ResourceAdded, this._resourceAdded, this);
</ins><span class="cx"> 
</span><span class="cx">         WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.BreakpointsEnabledDidChange, this._breakpointsEnabledDidChange, this);
</span><span class="cx">         WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.CallFramesDidChange, this._debuggerCallFramesDidChange, this);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsFolderizedTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/FolderizedTreeElement.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/FolderizedTreeElement.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/FolderizedTreeElement.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -54,7 +54,7 @@
</span><span class="cx">     registerFolderizeSettings(type, displayName, representedObject, treeElementConstructor)
</span><span class="cx">     {
</span><span class="cx">         console.assert(type);
</span><del>-        console.assert(displayName);
</del><ins>+        console.assert(displayName || displayName === null);
</ins><span class="cx">         console.assert(representedObject);
</span><span class="cx">         console.assert(typeof treeElementConstructor === &quot;function&quot;);
</span><span class="cx"> 
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx">         let settings = {
</span><span class="cx">             type,
</span><span class="cx">             displayName,
</span><ins>+            topLevel: displayName === null,
</ins><span class="cx">             representedObject,
</span><span class="cx">             treeElementConstructor,
</span><span class="cx">         };
</span><span class="lines">@@ -227,6 +228,15 @@
</span><span class="cx"> 
</span><span class="cx">     _compareTreeElementsByMainTitle(a, b)
</span><span class="cx">     {
</span><ins>+        // Folders before anything.
+        let aIsFolder = a instanceof WebInspector.FolderTreeElement;
+        let bIsFolder = b instanceof WebInspector.FolderTreeElement;
+        if (aIsFolder &amp;&amp; !bIsFolder)
+            return -1;
+        if (bIsFolder &amp;&amp; !aIsFolder)
+            return 1;
+
+        // Then sort by title.
</ins><span class="cx">         return a.mainTitle.localeCompare(b.mainTitle);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -290,6 +300,9 @@
</span><span class="cx">             return this;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        if (settings.topLevel)
+            return this;
+
</ins><span class="cx">         var folder = this._folderTypeMap.get(settings.type);
</span><span class="cx">         if (folder)
</span><span class="cx">             return folder;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsOpenResourceDialogjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/OpenResourceDialog.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/OpenResourceDialog.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/OpenResourceDialog.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -122,6 +122,7 @@
</span><span class="cx">     {
</span><span class="cx">         WebInspector.Frame.removeEventListener(WebInspector.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
</span><span class="cx">         WebInspector.Frame.removeEventListener(WebInspector.Frame.Event.ResourceWasAdded, this._resourceWasAdded, this);
</span><ins>+        WebInspector.Target.removeEventListener(WebInspector.Target.Event.ResourceAdded, this._resourceWasAdded, this);
</ins><span class="cx">         WebInspector.debuggerManager.removeEventListener(WebInspector.DebuggerManager.Event.ScriptAdded, this._scriptAdded, this);
</span><span class="cx"> 
</span><span class="cx">         this._queryController.reset();
</span><span class="lines">@@ -131,6 +132,7 @@
</span><span class="cx">     {
</span><span class="cx">         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
</span><span class="cx">         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.ResourceWasAdded, this._resourceWasAdded, this);
</span><ins>+        WebInspector.Target.addEventListener(WebInspector.Target.Event.ResourceAdded, this._resourceWasAdded, this);
</ins><span class="cx">         WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.ScriptAdded, this._scriptAdded, this);
</span><span class="cx"> 
</span><span class="cx">         if (WebInspector.frameResourceManager.mainFrame)
</span><span class="lines">@@ -138,7 +140,7 @@
</span><span class="cx"> 
</span><span class="cx">         for (let target of WebInspector.targets) {
</span><span class="cx">             if (target !== WebInspector.mainTarget)
</span><del>-                this._addScriptsForTarget(target);
</del><ins>+                this._addResourcesForTarget(target);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         this._updateFilter();
</span><span class="lines">@@ -285,12 +287,19 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    _addScriptsForTarget(target)
</del><ins>+    _addResourcesForTarget(target)
</ins><span class="cx">     {
</span><span class="cx">         const suppressFilterUpdate = true;
</span><span class="cx"> 
</span><ins>+        this._addResource(target.mainResource);
+
+        for (let resource of target.resourceCollection.items)
+            this._addResource(resource, suppressFilterUpdate);
+
</ins><span class="cx">         let targetData = WebInspector.debuggerManager.dataForTarget(target);
</span><span class="cx">         for (let script of targetData.scripts) {
</span><ins>+            if (script.resource)
+                continue;
</ins><span class="cx">             if (isWebKitInternalScript(script.sourceURL) || isWebInspectorConsoleEvaluationScript(script.sourceURL))
</span><span class="cx">                 continue;
</span><span class="cx">             this._addResource(script, suppressFilterUpdate);
</span><span class="lines">@@ -313,6 +322,9 @@
</span><span class="cx">     _scriptAdded(event)
</span><span class="cx">     {
</span><span class="cx">         let script = event.data.script;
</span><ins>+        if (script.resource)
+            return;
+
</ins><span class="cx">         if (script.target === WebInspector.mainTarget)
</span><span class="cx">             return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsResourceDetailsSidebarPaneljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -121,16 +121,23 @@
</span><span class="cx">         var resourceToInspect = null;
</span><span class="cx"> 
</span><span class="cx">         // Iterate over the objects to find a WebInspector.Resource to inspect.
</span><del>-        for (var i = 0; i &lt; objects.length; ++i) {
-            if (objects[i] instanceof WebInspector.Resource) {
-                resourceToInspect = objects[i];
</del><ins>+        for (let object of objects) {
+            if (object instanceof WebInspector.Resource) {
+                resourceToInspect = object;
</ins><span class="cx">                 break;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            if (objects[i] instanceof WebInspector.Frame) {
-                resourceToInspect = objects[i].mainResource;
</del><ins>+            if (object instanceof WebInspector.Frame) {
+                resourceToInspect = object.mainResource;
</ins><span class="cx">                 break;
</span><span class="cx">             }
</span><ins>+
+            // FIXME: &lt;https://webkit.org/b/164427&gt; Web Inspector: WorkerTarget's mainResource should be a Resource not a Script
+            // If that was the case, then we could just have WorkerTreeElement contain the Resource and not a Script.
+            if (object instanceof WebInspector.Script &amp;&amp; object.isMainResource() &amp;&amp; object.resource) {
+                resourceToInspect = object.resource;
+                break;
+            }
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         this.resource = resourceToInspect;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsResourceSidebarPaneljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -37,7 +37,6 @@
</span><span class="cx">         this.addSubview(this._navigationBar);
</span><span class="cx"> 
</span><span class="cx">         this._targetTreeElementMap = new Map;
</span><del>-        this._deferredTargetScripts = [];
</del><span class="cx"> 
</span><span class="cx">         var scopeItemPrefix = &quot;resource-sidebar-&quot;;
</span><span class="cx">         var scopeBarItems = [];
</span><span class="lines">@@ -287,16 +286,17 @@
</span><span class="cx">         if (!script.url &amp;&amp; !script.sourceURL)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        // If the script URL matches a resource we can assume it is part of that resource and does not need added.
-        if (script.resource || script.dynamicallyAddedScriptElement)
-            return;
-
</del><span class="cx">         // Worker script.
</span><span class="cx">         if (script.target !== WebInspector.mainTarget) {
</span><del>-            this._addScriptForNonMainTarget(script);
</del><ins>+            if (script.isMainResource())
+                this._addTargetWithMainResource(script.target)
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        // If the script URL matches a resource we can assume it is part of that resource and does not need added.
+        if (script.resource || script.dynamicallyAddedScriptElement)
+            return;
+
</ins><span class="cx">         let insertIntoTopLevel = false;
</span><span class="cx">         let parentFolderTreeElement = null;
</span><span class="cx"> 
</span><span class="lines">@@ -380,7 +380,6 @@
</span><span class="cx">             this._anonymousScriptsFolderTreeElement = null;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        this._deferredTargetScripts = [];
</del><span class="cx">         if (this._targetTreeElementMap.size) {
</span><span class="cx">             for (let treeElement of this._targetTreeElementMap)
</span><span class="cx">                 treeElement.parent.removeChild(treeElement, suppressOnDeselect, suppressSelectSibling);
</span><span class="lines">@@ -388,42 +387,15 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    _addScriptForNonMainTarget(script)
-    {
-        let targetTreeElement = this._targetTreeElementMap.get(script.target);
-        if (!targetTreeElement) {
-            // Defer adding this script until we have the main resource for the Target.
-            // This can happen when opening the inspector after a page has already loaded,
-            // in those cases the scriptDidParse events are in random order.
-            if (script.isMainResource())
-                this._addTargetWithMainResource(script.target);
-            else
-                this._deferredTargetScripts.push(script);
-            return;
-        }
-
-        let scriptTreeElement = new WebInspector.ScriptTreeElement(script);
-        let index = insertionIndexForObjectInListSortedByFunction(scriptTreeElement, targetTreeElement.children, this._compareTreeElements);
-        targetTreeElement.insertChild(scriptTreeElement, index);
-    }
-
</del><span class="cx">     _addTargetWithMainResource(target)
</span><span class="cx">     {
</span><span class="cx">         console.assert(target.type === WebInspector.Target.Type.Worker);
</span><span class="cx"> 
</span><del>-        let targetTreeElement = new WebInspector.TargetTreeElement(target);
</del><ins>+        let targetTreeElement = new WebInspector.WorkerTreeElement(target);
</ins><span class="cx">         this._targetTreeElementMap.set(target, targetTreeElement);
</span><span class="cx"> 
</span><span class="cx">         let index = insertionIndexForObjectInListSortedByFunction(targetTreeElement, this.contentTreeOutline.children, this._compareTreeElements);
</span><span class="cx">         this.contentTreeOutline.insertChild(targetTreeElement, index);
</span><del>-
-        let [deferredScriptsForThisTarget, deferredScriptsForAnotherTarget] = this._deferredTargetScripts.partition((script) =&gt; script.target === target);
-        this._deferredTargetScripts = deferredScriptsForAnotherTarget;
-        for (let script of deferredScriptsForThisTarget) {
-            let scriptTreeElement = new WebInspector.ScriptTreeElement(script);
-            let index = insertionIndexForObjectInListSortedByFunction(scriptTreeElement, targetTreeElement.children, this._compareTreeElements);
-            targetTreeElement.insertChild(scriptTreeElement, index);
-        }
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     _targetRemoved(event)
</span><span class="lines">@@ -433,8 +405,6 @@
</span><span class="cx">         let targetTreeElement = this._targetTreeElementMap.take(removedTarget);
</span><span class="cx">         if (targetTreeElement)
</span><span class="cx">             targetTreeElement.parent.removeChild(targetTreeElement);
</span><del>-
-        this._deferredTargetScripts = this._deferredTargetScripts.filter((script) =&gt; script.target !== removedTarget);
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     _treeSelectionDidChange(event)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsResourceTimelineDataGridNodejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTimelineDataGridNode.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTimelineDataGridNode.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTimelineDataGridNode.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -149,7 +149,7 @@
</span><span class="cx"> 
</span><span class="cx">     appendContextMenuItems(contextMenu)
</span><span class="cx">     {
</span><del>-        WebInspector.appendContextMenuItemsForResource(contextMenu, this._resource);
</del><ins>+        WebInspector.appendContextMenuItemsForSourceCode(contextMenu, this._resource);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Protected
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsResourceTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -136,13 +136,16 @@
</span><span class="cx">     _updateTitles()
</span><span class="cx">     {
</span><span class="cx">         var frame = this._resource.parentFrame;
</span><ins>+        var target = this._resource.target;
+
</ins><span class="cx">         var isMainResource = this._resource.isMainResource();
</span><ins>+        var parentResourceHost = target.mainResource ? target.mainResource.urlComponents.host : null;
</ins><span class="cx">         if (isMainResource &amp;&amp; frame) {
</span><span class="cx">             // When the resource is a main resource, get the host from the current frame's parent frame instead of the current frame.
</span><del>-            var parentResourceHost = frame.parentFrame ? frame.parentFrame.mainResource.urlComponents.host : null;
</del><ins>+            parentResourceHost = frame.parentFrame ? frame.parentFrame.mainResource.urlComponents.host : null;
</ins><span class="cx">         } else if (frame) {
</span><span class="cx">             // When the resource is a normal sub-resource, get the host from the current frame's main resource.
</span><del>-            var parentResourceHost = frame.mainResource.urlComponents.host;
</del><ins>+            parentResourceHost = frame.mainResource.urlComponents.host;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         var urlComponents = this._resource.urlComponents;
</span><span class="lines">@@ -151,7 +154,7 @@
</span><span class="cx">         this.mainTitle = WebInspector.displayNameForURL(this._resource.url, urlComponents);
</span><span class="cx"> 
</span><span class="cx">         // Show the host as the subtitle if it is different from the main resource or if this is the main frame's main resource.
</span><del>-        var subtitle = parentResourceHost !== urlComponents.host || frame.isMainFrame() &amp;&amp; isMainResource ? WebInspector.displayNameForHost(urlComponents.host) : null;
</del><ins>+        var subtitle = parentResourceHost !== urlComponents.host || frame &amp;&amp; frame.isMainFrame() &amp;&amp; isMainResource ? WebInspector.displayNameForHost(urlComponents.host) : null;
</ins><span class="cx">         this.subtitle = this.mainTitle !== subtitle ? subtitle : null;
</span><span class="cx"> 
</span><span class="cx">         if (oldMainTitle !== this.mainTitle)
</span><span class="lines">@@ -162,7 +165,7 @@
</span><span class="cx">     {
</span><span class="cx">         let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
</span><span class="cx"> 
</span><del>-        WebInspector.appendContextMenuItemsForResource(contextMenu, this._resource);
</del><ins>+        WebInspector.appendContextMenuItemsForSourceCode(contextMenu, this._resource);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Private
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTreeElement.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTreeElement.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTreeElement.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -173,12 +173,16 @@
</span><span class="cx"> 
</span><span class="cx">         console.assert(this.hasChildren);
</span><span class="cx"> 
</span><del>-        var wasSelected = childTreeElement.selected;
</del><ins>+        let parentTreeElement = childTreeElement.parent;
</ins><span class="cx"> 
</span><del>-        var parentTreeElement = childTreeElement.parent;
</del><ins>+        let wasParentExpanded = parentTreeElement.expanded;
+        let wasSelected = childTreeElement.selected;
+
</ins><span class="cx">         parentTreeElement.removeChild(childTreeElement, true, true);
</span><span class="cx">         parentTreeElement.insertChild(childTreeElement, insertionIndexForObjectInListSortedByFunction(childTreeElement, parentTreeElement.children, WebInspector.ResourceTreeElement.compareFolderAndResourceTreeElements));
</span><span class="cx"> 
</span><ins>+        if (wasParentExpanded)
+            parentTreeElement.expand();
</ins><span class="cx">         if (wasSelected)
</span><span class="cx">             childTreeElement.revealAndSelect(true, false, true, true);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTargetTreeElementjs"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebInspectorUI/UserInterface/Views/TargetTreeElement.js (208519 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TargetTreeElement.js        2016-11-10 03:06:45 UTC (rev 208519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TargetTreeElement.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -1,60 +0,0 @@
</span><del>-/*
- * 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.TargetTreeElement = class TargetTreeElement extends WebInspector.ScriptTreeElement
-{
-    constructor(target)
-    {
-        super(target.mainResource);
-
-        console.assert(target instanceof WebInspector.Target);
-        console.assert(target.type === WebInspector.Target.Type.Worker);
-        console.assert(target.mainResource instanceof WebInspector.Script);
-
-        this._target = target;
-
-        this._expandedSetting = new WebInspector.Setting(&quot;target-expanded-&quot; + this.target.name.hash, true);
-
-        if (this._expandedSetting.value)
-            this.expand();
-    }
-
-    // Public
-
-    get target() { return this._target; }
-
-    // Protected (TreeElement)
-
-    onexpand()
-    {
-        this._expandedSetting.value = true;
-    }
-
-    oncollapse()
-    {
-        if (this.hasChildren)
-            this._expandedSetting.value = false;
-    }
-};
</del></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsWorkerTreeElementjs"></a>
<div class="addfile"><h4>Added: trunk/Source/WebInspectorUI/UserInterface/Views/WorkerTreeElement.js (0 => 208520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/WorkerTreeElement.js                                (rev 0)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/WorkerTreeElement.js        2016-11-10 03:54:06 UTC (rev 208520)
</span><span class="lines">@@ -0,0 +1,168 @@
</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.
+ */
+
+// FIXME: &lt;https://webkit.org/b/164427&gt; Web Inspector: WorkerTarget's mainResource should be a Resource not a Script
+// When we are guaranteed a Resource and not a Script we can extend ResourceTreeElement.
+
+WebInspector.WorkerTreeElement = class WorkerTreeElement extends WebInspector.ScriptTreeElement
+{
+    constructor(target)
+    {
+        super(target.mainResource);
+
+        console.assert(target instanceof WebInspector.Target);
+        console.assert(target.type === WebInspector.Target.Type.Worker);
+        console.assert(target.mainResource instanceof WebInspector.Script);
+
+        this._target = target;
+        this._target.addEventListener(WebInspector.Target.Event.ResourceAdded, this._resourceAdded, this);
+        this._target.addEventListener(WebInspector.Target.Event.ScriptAdded, this._scriptAdded, this);
+
+        this._expandedSetting = new WebInspector.Setting(&quot;worker-expanded-&quot; + this._target.name.hash, true);
+
+        // Scripts are top level.
+        this.registerFolderizeSettings(&quot;scripts&quot;, null, this._target.resourceCollection.resourceCollectionForType(WebInspector.Resource.Type.Script), WebInspector.ResourceTreeElement);
+        this.registerFolderizeSettings(&quot;extra-scripts&quot;, null, this._target.extraScriptCollection, WebInspector.ScriptTreeElement);
+
+        // All other resources may be folderized.
+        for (let [key, value] of Object.entries(WebInspector.Resource.Type)) {
+            if (value === WebInspector.Resource.Type.Script)
+                continue;
+            let folderName = WebInspector.Resource.displayNameForType(value, true);
+            this.registerFolderizeSettings(key, folderName, this._target.resourceCollection.resourceCollectionForType(value), WebInspector.ResourceTreeElement);
+        }
+
+        this.updateParentStatus();
+
+        if (this._expandedSetting.value)
+            this.expand();
+    }
+
+    // Public
+
+    get target() { return this._target; }
+
+    // Protected (TreeElement)
+
+    onexpand()
+    {
+        this._expandedSetting.value = true;
+    }
+
+    oncollapse()
+    {
+        if (this.hasChildren)
+            this._expandedSetting.value = false;
+    }
+
+    onpopulate()
+    {
+        if (this.children.length &amp;&amp; !this.shouldRefreshChildren)
+            return;
+
+        this.shouldRefreshChildren = false;
+
+        this.removeChildren();
+        this.prepareToPopulate();
+
+        for (let resource of this._target.resourceCollection.items)
+            this.addChildForRepresentedObject(resource);
+
+        for (let script of this._target.extraScriptCollection.items)
+            this.addChildForRepresentedObject(script);
+
+        let sourceMaps = this._target.mainResource.sourceMaps;
+        for (let sourceMap of sourceMaps) {
+            for (let resource of sourceMap.resources)
+                this.addChildForRepresentedObject(resource);
+        }
+    }
+
+    // Overrides from SourceCodeTreeElement.
+
+    updateSourceMapResources()
+    {
+        // Handle our own SourceMapResources.
+
+        if (!this.treeOutline || !this.treeOutline.includeSourceMapResourceChildren)
+            return;
+
+        this.updateParentStatus();
+
+        if (this._target.mainResource.sourceMaps.length) {
+            this.hasChildren = true;
+            this.shouldRefreshChildren = true;
+        }
+    }
+
+    onattach()
+    {
+        // Handle our own SourceMapResources. Skip immediate superclasses.
+
+        WebInspector.GeneralTreeElement.prototype.onattach.call(this);
+
+        this.element.addEventListener(&quot;contextmenu&quot;, this._handleContextMenuEvent.bind(this));
+    }
+
+    // Overrides from FolderizedTreeElement
+
+    compareChildTreeElements(a, b)
+    {
+        let aIsResource = a instanceof WebInspector.ResourceTreeElement;
+        let bIsResource = b instanceof WebInspector.ResourceTreeElement;
+
+        if (aIsResource &amp;&amp; bIsResource)
+            return WebInspector.ResourceTreeElement.compareResourceTreeElements(a, b);
+
+        if (!aIsResource &amp;&amp; !bIsResource)
+            return super.compareChildTreeElements(a, b);
+
+        return aIsResource ? 1 : -1;
+    }
+
+    // Private
+
+    _handleContextMenuEvent(event)
+    {
+        let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
+
+        // FIXME: &lt;https://webkit.org/b/164427&gt; Web Inspector: WorkerTarget's mainResource should be a Resource not a Script
+        WebInspector.appendContextMenuItemsForSourceCode(contextMenu, this.script.resource ? this.script.resource : this.script);
+    }
+
+    _scriptAdded(event)
+    {
+        let script = event.data.script;
+        if (!script.url &amp;&amp; !script.sourceURL)
+            return;
+
+        this.addRepresentedObjectToNewChildQueue(script);
+    }
+
+    _resourceAdded(event)
+    {
+        this.addRepresentedObjectToNewChildQueue(event.data.resource);
+    }
+};
</ins></span></pre>
</div>
</div>

</body>
</html>