Changeset 224368 in webkit


Ignore:
Timestamp:
Nov 2, 2017, 6:30:01 PM (8 years ago)
Author:
Joseph Pecoraro
Message:

Make ServiceWorker a Remote Inspector debuggable target
https://bugs.webkit.org/show_bug.cgi?id=179043
<rdar://problem/34126008>

Reviewed by Brian Burg.

Source/JavaScriptCore:

  • inspector/remote/RemoteControllableTarget.h:
  • inspector/remote/RemoteInspectionTarget.h:
  • inspector/remote/RemoteInspectorConstants.h:

Include a new ServiceWorker remote inspector target type.

  • inspector/remote/cocoa/RemoteInspectorCocoa.mm:

(Inspector::RemoteInspector::listingForInspectionTarget const):
Implement listing for a ServiceWorker to include a URL like a page.

  • inspector/remote/glib/RemoteInspectorGlib.cpp:

(Inspector::RemoteInspector::listingForInspectionTarget const):
Bail for ServiceWorker support in glib. They will need to implement their support.

Source/WebCore:

  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:

New files.

  • workers/service/context/ServiceWorkerDebuggable.h: Added.
  • workers/service/context/ServiceWorkerDebuggable.cpp: Added.

(WebCore::ServiceWorkerDebuggable::ServiceWorkerDebuggable):
(WebCore::ServiceWorkerDebuggable::connect):
(WebCore::ServiceWorkerDebuggable::disconnect):
(WebCore::ServiceWorkerDebuggable::dispatchMessageFromRemote):
ServiceWorker remote inspector target, exposes the script url to debuggers.
Pass the channel on to the inspector proxy to hook it up to the worker.

  • workers/service/context/ServiceWorkerInspectorProxy.h:
  • workers/service/context/ServiceWorkerInspectorProxy.cpp: Added.

(WebCore::ServiceWorkerInspectorProxy::ServiceWorkerInspectorProxy):
(WebCore::ServiceWorkerInspectorProxy::~ServiceWorkerInspectorProxy):
(WebCore::ServiceWorkerInspectorProxy::serviceWorkerTerminated):
Handle interesting events throughout a Service Worker life cycle.

(WebCore::ServiceWorkerInspectorProxy::connectToWorker):
(WebCore::ServiceWorkerInspectorProxy::disconnectFromWorker):
(WebCore::ServiceWorkerInspectorProxy::sendMessageToWorker):
(WebCore::ServiceWorkerInspectorProxy::sendMessageFromWorkerToFrontend):
Implement existing worker debugger hooks for connection setup and sending messages.
Inspector protocol messages come in on the MainThread and hop over to the
WorkerThread to be handled on the expected context thread. Likewise outgoing
messages hop back to be sent through the InspectorFrontend channel on MainThread.

  • workers/service/context/ServiceWorkerThread.cpp:

(WebCore::ServiceWorkerThread::ServiceWorkerThread):

  • workers/service/context/ServiceWorkerThread.h:
  • workers/service/context/ServiceWorkerThreadProxy.h:
  • workers/service/context/ServiceWorkerThreadProxy.cpp:

(WebCore::ServiceWorkerThreadProxy::ServiceWorkerThreadProxy):
(WebCore::ServiceWorkerThreadProxy::postMessageToDebugger):
Construct the new inspector proxy and debuggable registration.
Call lifecycle events and debugger hooks when appropriate.

Source/WebInspectorUI:

Customize the Web Inspector frontend for a ServiceWorker target.
Currently this just behaves like a JavaScript Context target because
we haven't yet added support for Networking capabilities.

  • UserInterface/Controllers/DebuggerManager.js:

(WI.DebuggerManager.prototype.get knownNonResourceScripts):
Drive-by fix a bug where lazily initializing the Resources / Debugger tabs
would show Console evaluation scripts. We should ignore them, like we
do in other places.

  • Localizations/en.lproj/localizedStrings.js:
  • UserInterface/Controllers/AppController.js:

(WI.AppController):
(WI.AppController.debuggableTypeFromHost):

  • UserInterface/Controllers/AppControllerBase.js:
  • UserInterface/Controllers/TimelineManager.js:

(WI.TimelineManager.defaultTimelineTypes):
(WI.TimelineManager.availableTimelineTypes):

  • UserInterface/Models/TimelineRecording.js:

(WI.TimelineRecording.sourceCodeTimelinesSupported):

  • UserInterface/Protocol/MainTarget.js:

(WI.MainTarget.prototype.get displayName):

  • UserInterface/Test/TestAppController.js:
  • UserInterface/Views/DashboardContainerView.css:

(body:not(.web) .toolbar .dashboard-container):
(body.javascript .toolbar .dashboard-container): Deleted.

  • UserInterface/Views/DefaultDashboardView.css:

(body:not(.web) .toolbar .dashboard.default > :matches(.resourcesCount, .resourcesSize, .time)):
(body.javascript .toolbar .dashboard.default > :matches(.resourcesCount, .resourcesSize, .time)): Deleted.

  • UserInterface/Views/ResourceSidebarPanel.js:

(WI.ResourceSidebarPanel):
(WI.ResourceSidebarPanel.shouldPlaceResourcesAtTopLevel):
(WI.ResourceSidebarPanel.prototype.initialLayout):
(WI.ResourceSidebarPanel.prototype._addScript):
(WI.ResourceSidebarPanel.prototype._extraDomainsActivated):

  • UserInterface/Views/Toolbar.js:

Source/WebKit:

  • UIProcess/API/Cocoa/_WKRemoteWebInspectorViewController.h:
  • UIProcess/API/Cocoa/_WKRemoteWebInspectorViewController.mm:

(debuggableTypeString):
Provide a way to start a Remote Web Inspector frontend for a ServiceWorker target type.

Location:
trunk/Source
Files:
3 added
29 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r224366 r224368  
     12017-11-02  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Make ServiceWorker a Remote Inspector debuggable target
     4        https://bugs.webkit.org/show_bug.cgi?id=179043
     5        <rdar://problem/34126008>
     6
     7        Reviewed by Brian Burg.
     8
     9        * inspector/remote/RemoteControllableTarget.h:
     10        * inspector/remote/RemoteInspectionTarget.h:
     11        * inspector/remote/RemoteInspectorConstants.h:
     12        Include a new ServiceWorker remote inspector target type.
     13
     14        * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
     15        (Inspector::RemoteInspector::listingForInspectionTarget const):
     16        Implement listing for a ServiceWorker to include a URL like a page.
     17
     18        * inspector/remote/glib/RemoteInspectorGlib.cpp:
     19        (Inspector::RemoteInspector::listingForInspectionTarget const):
     20        Bail for ServiceWorker support in glib. They will need to implement their support.
     21
    1222017-11-02  Michael Saboff  <msaboff@apple.com>
    223
  • trunk/Source/JavaScriptCore/inspector/remote/RemoteControllableTarget.h

    r217509 r224368  
    5252    void setTargetIdentifier(unsigned identifier) { m_identifier = identifier; }
    5353
    54     enum class Type { JavaScript, Web, Automation };
     54    enum class Type { JavaScript, ServiceWorker, Web, Automation };
    5555    virtual Type type() const = 0;
    5656    virtual bool remoteControlAllowed() const = 0;
  • trunk/Source/JavaScriptCore/inspector/remote/RemoteInspectionTarget.h

    r217509 r224368  
    7272    { \
    7373        return target.type() == Inspector::RemoteControllableTarget::Type::JavaScript \
     74            || target.type() == Inspector::RemoteControllableTarget::Type::ServiceWorker \
    7475            || target.type() == Inspector::RemoteControllableTarget::Type::Web; \
    7576    }
  • trunk/Source/JavaScriptCore/inspector/remote/RemoteInspectorConstants.h

    r221208 r224368  
    7373#define WIRTypeKey                              @"WIRTypeKey"
    7474#define WIRTypeJavaScript                       @"WIRTypeJavaScript"
     75#define WIRTypeServiceWorker                    @"WIRTypeServiceWorker"
    7576#define WIRTypeWeb                              @"WIRTypeWeb"
    7677#define WIRTypeAutomation                       @"WIRTypeAutomation"
  • trunk/Source/JavaScriptCore/inspector/remote/cocoa/RemoteInspectorCocoa.mm

    r221204 r224368  
    393393        [listing setObject:WIRTypeJavaScript forKey:WIRTypeKey];
    394394        break;
     395    case RemoteInspectionTarget::Type::ServiceWorker:
     396        [listing setObject:target.url() forKey:WIRURLKey];
     397        [listing setObject:target.name() forKey:WIRTitleKey];
     398        [listing setObject:WIRTypeServiceWorker forKey:WIRTypeKey];
     399        break;
    395400    case RemoteInspectionTarget::Type::Web:
    396401        [listing setObject:target.url() forKey:WIRURLKey];
  • trunk/Source/JavaScriptCore/inspector/remote/glib/RemoteInspectorGlib.cpp

    r220860 r224368  
    187187        return nullptr;
    188188
     189    // FIXME: Support remote debugging of a ServiceWorker.
     190    if (target.type() == RemoteInspectionTarget::Type::ServiceWorker)
     191        return nullptr;
     192
    189193    ASSERT(target.type() == RemoteInspectionTarget::Type::Web || target.type() == RemoteInspectionTarget::Type::JavaScript);
    190194    return g_variant_new("(tsssb)", static_cast<guint64>(target.targetIdentifier()),
  • trunk/Source/WebCore/ChangeLog

    r224360 r224368  
     12017-11-02  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Make ServiceWorker a Remote Inspector debuggable target
     4        https://bugs.webkit.org/show_bug.cgi?id=179043
     5        <rdar://problem/34126008>
     6
     7        Reviewed by Brian Burg.
     8
     9        * Sources.txt:
     10        * WebCore.xcodeproj/project.pbxproj:
     11        New files.
     12
     13        * workers/service/context/ServiceWorkerDebuggable.h: Added.
     14        * workers/service/context/ServiceWorkerDebuggable.cpp: Added.
     15        (WebCore::ServiceWorkerDebuggable::ServiceWorkerDebuggable):
     16        (WebCore::ServiceWorkerDebuggable::connect):
     17        (WebCore::ServiceWorkerDebuggable::disconnect):
     18        (WebCore::ServiceWorkerDebuggable::dispatchMessageFromRemote):
     19        ServiceWorker remote inspector target, exposes the script url to debuggers.
     20        Pass the channel on to the inspector proxy to hook it up to the worker.
     21
     22        * workers/service/context/ServiceWorkerInspectorProxy.h:
     23        * workers/service/context/ServiceWorkerInspectorProxy.cpp: Added.
     24        (WebCore::ServiceWorkerInspectorProxy::ServiceWorkerInspectorProxy):
     25        (WebCore::ServiceWorkerInspectorProxy::~ServiceWorkerInspectorProxy):
     26        (WebCore::ServiceWorkerInspectorProxy::serviceWorkerTerminated):
     27        Handle interesting events throughout a Service Worker life cycle.
     28
     29        (WebCore::ServiceWorkerInspectorProxy::connectToWorker):
     30        (WebCore::ServiceWorkerInspectorProxy::disconnectFromWorker):
     31        (WebCore::ServiceWorkerInspectorProxy::sendMessageToWorker):
     32        (WebCore::ServiceWorkerInspectorProxy::sendMessageFromWorkerToFrontend):
     33        Implement existing worker debugger hooks for connection setup and sending messages.
     34        Inspector protocol messages come in on the MainThread and hop over to the
     35        WorkerThread to be handled on the expected context thread. Likewise outgoing
     36        messages hop back to be sent through the InspectorFrontend channel on MainThread.
     37
     38        * workers/service/context/ServiceWorkerThread.cpp:
     39        (WebCore::ServiceWorkerThread::ServiceWorkerThread):
     40        * workers/service/context/ServiceWorkerThread.h:
     41        * workers/service/context/ServiceWorkerThreadProxy.h:
     42        * workers/service/context/ServiceWorkerThreadProxy.cpp:
     43        (WebCore::ServiceWorkerThreadProxy::ServiceWorkerThreadProxy):
     44        (WebCore::ServiceWorkerThreadProxy::postMessageToDebugger):
     45        Construct the new inspector proxy and debuggable registration.
     46        Call lifecycle events and debugger hooks when appropriate.
     47
    1482017-11-02  Antti Koivisto  <antti@apple.com>
    249
  • trunk/Source/WebCore/Sources.txt

    r224345 r224368  
    21712171workers/service/ServiceWorkerWindowClient.cpp
    21722172
     2173workers/service/context/ServiceWorkerDebuggable.cpp
    21732174workers/service/context/ServiceWorkerFetch.cpp
     2175workers/service/context/ServiceWorkerInspectorProxy.cpp
    21742176workers/service/context/ServiceWorkerThread.cpp
    21752177workers/service/context/ServiceWorkerThreadProxy.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r224345 r224368  
    28192819                A513B3D7114B1666001C429B /* KeyEventCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = A5C974CF11485FF10066F2AB /* KeyEventCocoa.h */; };
    28202820                A516E8B7136E04DB0076C3C0 /* LocalizedDateCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A516E8B4136E04DB0076C3C0 /* LocalizedDateCache.h */; };
    2821                 A52B349E1FA41703008B6246 /* WorkerDebuggerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = A52B349C1FA416F8008B6246 /* WorkerDebuggerProxy.h */; };
     2821                A52B348F1FA3BDA6008B6246 /* ServiceWorkerDebuggable.h in Headers */ = {isa = PBXBuildFile; fileRef = A52B348C1FA3BD79008B6246 /* ServiceWorkerDebuggable.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2822                A52B34961FA3E290008B6246 /* ServiceWorkerInspectorProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = A52B34931FA3E286008B6246 /* ServiceWorkerInspectorProxy.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2823                A52B349E1FA41703008B6246 /* WorkerDebuggerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = A52B349C1FA416F8008B6246 /* WorkerDebuggerProxy.h */; settings = {ATTRIBUTES = (Private, ); }; };
    28222824                A5416FE618810EF80009FC5F /* YouTubeEmbedShadowElement.h in Headers */ = {isa = PBXBuildFile; fileRef = A5416FE418810EF80009FC5F /* YouTubeEmbedShadowElement.h */; };
    28232825                A54A0C621DB7F8C10017A90B /* WorkerInspectorController.h in Headers */ = {isa = PBXBuildFile; fileRef = A54A0C601DB7F8B70017A90B /* WorkerInspectorController.h */; };
     
    1067810680                A518225417E2A0D400A9BA1D /* InspectorOverlayPage.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = InspectorOverlayPage.css; sourceTree = "<group>"; };
    1067910681                A518225517E2A0D400A9BA1D /* InspectorOverlayPage.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = InspectorOverlayPage.js; sourceTree = "<group>"; };
     10682                A52B348C1FA3BD79008B6246 /* ServiceWorkerDebuggable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerDebuggable.h; sourceTree = "<group>"; };
     10683                A52B348E1FA3BD79008B6246 /* ServiceWorkerDebuggable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerDebuggable.cpp; sourceTree = "<group>"; };
     10684                A52B34931FA3E286008B6246 /* ServiceWorkerInspectorProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerInspectorProxy.h; sourceTree = "<group>"; };
     10685                A52B34951FA3E286008B6246 /* ServiceWorkerInspectorProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerInspectorProxy.cpp; sourceTree = "<group>"; };
    1068010686                A52B349C1FA416F8008B6246 /* WorkerDebuggerProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerDebuggerProxy.h; sourceTree = "<group>"; };
    1068110687                A5416FE318810EF80009FC5F /* YouTubeEmbedShadowElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = YouTubeEmbedShadowElement.cpp; sourceTree = "<group>"; };
     
    1710117107                        isa = PBXGroup;
    1710217108                        children = (
     17109                                A52B348E1FA3BD79008B6246 /* ServiceWorkerDebuggable.cpp */,
     17110                                A52B348C1FA3BD79008B6246 /* ServiceWorkerDebuggable.h */,
    1710317111                                419ACF901F97E7D6009F1A83 /* ServiceWorkerFetch.cpp */,
    1710417112                                419ACF8E1F97E7D5009F1A83 /* ServiceWorkerFetch.h */,
     17113                                A52B34951FA3E286008B6246 /* ServiceWorkerInspectorProxy.cpp */,
     17114                                A52B34931FA3E286008B6246 /* ServiceWorkerInspectorProxy.h */,
    1710517115                                517C87111F8EE72F00EB8076 /* ServiceWorkerThread.cpp */,
    1710617116                                517C87101F8EE72E00EB8076 /* ServiceWorkerThread.h */,
     
    2888128891                                51F1755F1F3EBC8300C74950 /* ServiceWorkerContainer.h in Headers */,
    2888228892                                51CA7EE91F883390003D3131 /* ServiceWorkerContextData.h in Headers */,
     28893                                A52B348F1FA3BDA6008B6246 /* ServiceWorkerDebuggable.h in Headers */,
    2888328894                                419ACF921F97E7DA009F1A83 /* ServiceWorkerFetch.h in Headers */,
    2888428895                                517A535D1F5899FE00DCDC0A /* ServiceWorkerFetchResult.h in Headers */,
    2888528896                                51F175611F3EBC8300C74950 /* ServiceWorkerGlobalScope.h in Headers */,
     28897                                A52B34961FA3E290008B6246 /* ServiceWorkerInspectorProxy.h in Headers */,
    2888628898                                51F175631F3EBC8300C74950 /* ServiceWorkerJob.h in Headers */,
    2888728899                                51F175641F3EBC8300C74950 /* ServiceWorkerJobClient.h in Headers */,
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerInspectorProxy.h

    r224367 r224368  
    2424 */
    2525
    26 WI.AppController = class AppController extends WI.AppControllerBase
    27 {
    28     constructor()
    29     {
    30         super();
     26#pragma once
    3127
    32         this._hasExtraDomains = false;
    33         this._debuggableType = InspectorFrontendHost.debuggableType() === "web" ? WI.DebuggableType.Web : WI.DebuggableType.JavaScript;
    34     }
     28#if ENABLE(SERVICE_WORKER)
    3529
    36     // Properties.
     30#include <wtf/Forward.h>
    3731
    38     get hasExtraDomains() { return this._hasExtraDomains; }
    39     get debuggableType() { return this._debuggableType; }
     32// All of these methods should be called on the Main Thread.
     33// Used to send messages to the WorkerInspector on the WorkerThread.
    4034
    41     // API.
     35namespace Inspector {
     36class FrontendChannel;
     37}
    4238
    43     activateExtraDomains(domains)
    44     {
    45         if (this._hasExtraDomains)
    46             throw new Error("Extra domains have already been activated, cannot activate again.");
     39namespace WebCore {
    4740
    48         this._hasExtraDomains = true;
     41class ServiceWorkerThreadProxy;
    4942
    50         for (let domain of domains) {
    51             let agent = InspectorBackend.activateDomain(domain);
    52             if (agent.enable)
    53                 agent.enable();
    54         }
     43class ServiceWorkerInspectorProxy {
     44    WTF_MAKE_NONCOPYABLE(ServiceWorkerInspectorProxy);
     45    WTF_MAKE_FAST_ALLOCATED;
     46public:
     47    explicit ServiceWorkerInspectorProxy(ServiceWorkerThreadProxy&);
     48    ~ServiceWorkerInspectorProxy();
    5549
    56         // FIXME: all code within WI.activateExtraDomains should be distributed elsewhere.
    57         WI.activateExtraDomains(domains);
    58     }
     50    void serviceWorkerTerminated();
     51
     52    void connectToWorker(Inspector::FrontendChannel*);
     53    void disconnectFromWorker(Inspector::FrontendChannel*);
     54    void sendMessageToWorker(const String&);
     55    void sendMessageFromWorkerToFrontend(const String&);
     56
     57private:
     58    ServiceWorkerThreadProxy& m_serviceWorkerThreadProxy;
     59    Inspector::FrontendChannel* m_channel { nullptr };
    5960};
     61
     62} // namespace WebCore
     63
     64#endif // ENABLE(SERVICE_WORKER)
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp

    r224321 r224368  
    4747namespace WebCore {
    4848
    49 class DummyServiceWorkerThreadProxy : public WorkerObjectProxy, public WorkerDebuggerProxy {
     49class DummyServiceWorkerThreadProxy : public WorkerObjectProxy {
    5050public:
    5151    static DummyServiceWorkerThreadProxy& shared()
     
    5757private:
    5858    void postExceptionToWorkerObject(const String&, int, int, const String&) final { };
    59     void postMessageToDebugger(const String&) final { }
    6059    void workerGlobalScopeDestroyed() final { };
    6160    void postMessageToWorkerObject(Ref<SerializedScriptValue>&&, std::unique_ptr<MessagePortChannelArray>&&) final { };
     
    6564
    6665// FIXME: Use a valid WorkerReportingProxy
    67 // FIXME: Use a valid WorkerDebuggerProxy
    6866// FIXME: Use a valid WorkerObjectProxy
    6967// FIXME: Use a valid IDBConnection
     
    7371// FIXME: Use valid runtime flags
    7472
    75 ServiceWorkerThread::ServiceWorkerThread(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData& data, PAL::SessionID, WorkerLoaderProxy& loaderProxy)
    76     : WorkerThread(data.scriptURL, data.workerID, ASCIILiteral("WorkerUserAgent"), /* isOnline */ false, data.script, loaderProxy, DummyServiceWorkerThreadProxy::shared(), DummyServiceWorkerThreadProxy::shared(), WorkerThreadStartMode::Normal, ContentSecurityPolicyResponseHeaders { }, false, SecurityOrigin::create(data.scriptURL).get(), MonotonicTime::now(), nullptr, nullptr, JSC::RuntimeFlags::createAllEnabled(), SessionID::defaultSessionID())
     73ServiceWorkerThread::ServiceWorkerThread(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData& data, PAL::SessionID, WorkerLoaderProxy& loaderProxy, WorkerDebuggerProxy& debuggerProxy)
     74    : WorkerThread(data.scriptURL, data.workerID, ASCIILiteral("WorkerUserAgent"), /* isOnline */ false, data.script, loaderProxy, debuggerProxy, DummyServiceWorkerThreadProxy::shared(), WorkerThreadStartMode::Normal, ContentSecurityPolicyResponseHeaders { }, false, SecurityOrigin::create(data.scriptURL).get(), MonotonicTime::now(), nullptr, nullptr, JSC::RuntimeFlags::createAllEnabled(), SessionID::defaultSessionID())
    7775    , m_serverConnectionIdentifier(serverConnectionIdentifier)
    7876    , m_data(data.isolatedCopy())
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h

    r224321 r224368  
    6666
    6767private:
    68     WEBCORE_EXPORT ServiceWorkerThread(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData&, PAL::SessionID, WorkerLoaderProxy&);
     68    WEBCORE_EXPORT ServiceWorkerThread(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData&, PAL::SessionID, WorkerLoaderProxy&, WorkerDebuggerProxy&);
    6969
    7070    uint64_t m_serverConnectionIdentifier;
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp

    r224295 r224368  
    5656    : m_page(createPageForServiceWorker(WTFMove(pageConfiguration), data.scriptURL))
    5757    , m_document(*m_page->mainFrame().document())
    58     , m_serviceWorkerThread(ServiceWorkerThread::create(serverConnectionIdentifier, data, sessionID, *this))
     58    , m_serviceWorkerThread(ServiceWorkerThread::create(serverConnectionIdentifier, data, sessionID, *this, *this))
    5959    , m_cacheStorageProvider(cacheStorageProvider)
    6060    , m_sessionID(sessionID)
     61    , m_inspectorProxy(*this)
    6162{
     63#if ENABLE(REMOTE_INSPECTOR)
     64    m_remoteDebuggable = std::make_unique<ServiceWorkerDebuggable>(*this, data);
     65    m_remoteDebuggable->setRemoteDebuggingAllowed(true);
     66    m_remoteDebuggable->init();
     67#endif
    6268}
    6369
     
    7682}
    7783
     84void ServiceWorkerThreadProxy::postMessageToDebugger(const String& message)
     85{
     86    RunLoop::main().dispatch([this, protectedThis = makeRef(*this), message = message.isolatedCopy()] {
     87        // FIXME: Handle terminated case.
     88        m_inspectorProxy.sendMessageFromWorkerToFrontend(message);
     89    });
     90}
     91
    7892Ref<CacheStorageConnection> ServiceWorkerThreadProxy::createCacheStorageConnection()
    7993{
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h

    r223981 r224368  
    3131#include "Document.h"
    3232#include "Page.h"
     33#include "ServiceWorkerDebuggable.h"
     34#include "ServiceWorkerInspectorProxy.h"
    3335#include "ServiceWorkerThread.h"
     36#include "WorkerDebuggerProxy.h"
    3437#include "WorkerLoaderProxy.h"
    3538#include <wtf/HashMap.h>
    3639
    3740namespace WebCore {
     41
    3842class CacheStorageProvider;
    3943class PageConfiguration;
     44class ServiceWorkerInspectorProxy;
    4045struct ServiceWorkerContextData;
    4146
    42 class ServiceWorkerThreadProxy final : public ThreadSafeRefCounted<ServiceWorkerThreadProxy>, public WorkerLoaderProxy {
     47class ServiceWorkerThreadProxy final : public ThreadSafeRefCounted<ServiceWorkerThreadProxy>, public WorkerLoaderProxy, public WorkerDebuggerProxy {
    4348public:
    4449    WEBCORE_EXPORT static Ref<ServiceWorkerThreadProxy> create(PageConfiguration&&, uint64_t serverConnectionIdentifier, const ServiceWorkerContextData&, PAL::SessionID, CacheStorageProvider&);
     
    4651    uint64_t identifier() const { return m_serviceWorkerThread->identifier(); }
    4752    ServiceWorkerThread& thread() { return m_serviceWorkerThread.get(); }
     53    ServiceWorkerInspectorProxy& inspectorProxy() { return m_inspectorProxy; }
    4854
    4955private:
    5056    ServiceWorkerThreadProxy(PageConfiguration&&, uint64_t serverConnectionIdentifier, const ServiceWorkerContextData&, PAL::SessionID, CacheStorageProvider&);
     57
     58    // WorkerLoaderProxy
    5159    bool postTaskForModeToWorkerGlobalScope(ScriptExecutionContext::Task&&, const String& mode) final;
    5260    void postTaskToLoader(ScriptExecutionContext::Task&&) final;
    5361    Ref<CacheStorageConnection> createCacheStorageConnection() final;
     62
     63    // WorkerDebuggerProxy
     64    void postMessageToDebugger(const String&) final;
    5465
    5566    UniqueRef<Page> m_page;
     
    5970    RefPtr<CacheStorageConnection> m_cacheStorageConnection;
    6071    PAL::SessionID m_sessionID;
     72    ServiceWorkerInspectorProxy m_inspectorProxy;
     73#if ENABLE(REMOTE_INSPECTOR)
     74    std::unique_ptr<ServiceWorkerDebuggable> m_remoteDebuggable;
     75#endif
    6176};
    6277
  • trunk/Source/WebInspectorUI/ChangeLog

    r224367 r224368  
     12017-11-02  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Make ServiceWorker a Remote Inspector debuggable target
     4        https://bugs.webkit.org/show_bug.cgi?id=179043
     5        <rdar://problem/34126008>
     6
     7        Reviewed by Brian Burg.
     8
     9        Customize the Web Inspector frontend for a ServiceWorker target.
     10        Currently this just behaves like a JavaScript Context target because
     11        we haven't yet added support for Networking capabilities.
     12
     13        * UserInterface/Controllers/DebuggerManager.js:
     14        (WI.DebuggerManager.prototype.get knownNonResourceScripts):
     15        Drive-by fix a bug where lazily initializing the Resources / Debugger tabs
     16        would show Console evaluation scripts. We should ignore them, like we
     17        do in other places.
     18
     19        * Localizations/en.lproj/localizedStrings.js:
     20        * UserInterface/Controllers/AppController.js:
     21        (WI.AppController):
     22        (WI.AppController.debuggableTypeFromHost):
     23        * UserInterface/Controllers/AppControllerBase.js:
     24        * UserInterface/Controllers/TimelineManager.js:
     25        (WI.TimelineManager.defaultTimelineTypes):
     26        (WI.TimelineManager.availableTimelineTypes):
     27        * UserInterface/Models/TimelineRecording.js:
     28        (WI.TimelineRecording.sourceCodeTimelinesSupported):
     29        * UserInterface/Protocol/MainTarget.js:
     30        (WI.MainTarget.prototype.get displayName):
     31        * UserInterface/Test/TestAppController.js:
     32        * UserInterface/Views/DashboardContainerView.css:
     33        (body:not(.web) .toolbar .dashboard-container):
     34        (body.javascript .toolbar .dashboard-container): Deleted.
     35        * UserInterface/Views/DefaultDashboardView.css:
     36        (body:not(.web) .toolbar .dashboard.default > :matches(.resourcesCount, .resourcesSize, .time)):
     37        (body.javascript .toolbar .dashboard.default > :matches(.resourcesCount, .resourcesSize, .time)): Deleted.
     38        * UserInterface/Views/ResourceSidebarPanel.js:
     39        (WI.ResourceSidebarPanel):
     40        (WI.ResourceSidebarPanel.shouldPlaceResourcesAtTopLevel):
     41        (WI.ResourceSidebarPanel.prototype.initialLayout):
     42        (WI.ResourceSidebarPanel.prototype._addScript):
     43        (WI.ResourceSidebarPanel.prototype._extraDomainsActivated):
     44        * UserInterface/Views/Toolbar.js:
     45
    1462017-11-02  Devin Rousso  <webkit@devinrousso.com>
    247
  • trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js

    r224367 r224368  
    819819localizedStrings["Semantic Issue"] = "Semantic Issue";
    820820localizedStrings["Service Worker"] = "Service Worker";
     821localizedStrings["ServiceWorker"] = "ServiceWorker";
    821822localizedStrings["Session"] = "Session";
    822823localizedStrings["Session Storage"] = "Session Storage";
  • trunk/Source/WebInspectorUI/UserInterface/Controllers/AppController.js

    r223948 r224368  
    3131
    3232        this._hasExtraDomains = false;
    33         this._debuggableType = InspectorFrontendHost.debuggableType() === "web" ? WI.DebuggableType.Web : WI.DebuggableType.JavaScript;
     33        this._debuggableType = AppController.debuggableTypeFromHost();
     34    }
     35
     36    // Static
     37
     38    static debuggableTypeFromHost()
     39    {
     40        let type = InspectorFrontendHost.debuggableType();
     41        switch (type) {
     42        case "javascript":
     43            return WI.DebuggableType.JavaScript;
     44        case "service-worker":
     45            return WI.DebuggableType.ServiceWorker;
     46        case "web":
     47            return WI.DebuggableType.Web;
     48        default:
     49            console.assert(false, "Unexpected debuggable type", type);
     50            return WI.DebuggableType.JavaScript;
     51        }
    3452    }
    3553
  • trunk/Source/WebInspectorUI/UserInterface/Controllers/AppControllerBase.js

    r223308 r224368  
    2525
    2626WI.DebuggableType = {
     27    JavaScript: "javascript",
     28    ServiceWorker: "service-worker",
    2729    Web: "web",
    28     JavaScript: "javascript"
    2930};
    3031
  • trunk/Source/WebInspectorUI/UserInterface/Controllers/DebuggerManager.js

    r221308 r224368  
    286286                if (script.resource)
    287287                    continue;
     288                if (isWebInspectorConsoleEvaluationScript(script.sourceURL))
     289                    continue;
    288290                if (!WI.isDebugUIEnabled() && isWebKitInternalScript(script.sourceURL))
    289291                    continue;
  • trunk/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js

    r222181 r224368  
    7474        }
    7575
     76        if (WI.sharedApp.debuggableType === WI.DebuggableType.ServiceWorker) {
     77            // FIXME: Support Network Timeline in ServiceWorker.
     78            let defaultTypes = [WI.TimelineRecord.Type.Script];
     79            if (WI.HeapAllocationsInstrument.supported())
     80                defaultTypes.push(WI.TimelineRecord.Type.HeapAllocations);
     81            return defaultTypes;
     82        }
     83
    7684        let defaultTypes = [
    7785            WI.TimelineRecord.Type.Network,
     
    8997    {
    9098        let types = WI.TimelineManager.defaultTimelineTypes();
    91         if (WI.sharedApp.debuggableType === WI.DebuggableType.JavaScript)
     99        if (WI.sharedApp.debuggableType === WI.DebuggableType.JavaScript || WI.sharedApp.debuggableType === WI.DebuggableType.ServiceWorker)
    92100            return types;
    93101
  • trunk/Source/WebInspectorUI/UserInterface/Models/TimelineRecording.js

    r222181 r224368  
    5757    static sourceCodeTimelinesSupported()
    5858    {
     59        // FIXME: Support Network Timeline in ServiceWorker.
    5960        return WI.sharedApp.debuggableType === WI.DebuggableType.Web;
    6061    }
  • trunk/Source/WebInspectorUI/UserInterface/Protocol/MainTarget.js

    r222181 r224368  
    3939    {
    4040        switch (WI.sharedApp.debuggableType) {
     41        case WI.DebuggableType.JavaScript:
     42            return WI.UIString("JavaScript Context");
     43        case WI.DebuggableType.ServiceWorker:
     44            return WI.UIString("ServiceWorker");
    4145        case WI.DebuggableType.Web:
    4246            return WI.UIString("Page");
    43         case WI.DebuggableType.JavaScript:
    44             return WI.UIString("JavaScript Context");
    4547        default:
    4648            console.error("Unexpected debuggable type: ", WI.sharedApp.debuggableType);
  • trunk/Source/WebInspectorUI/UserInterface/Test/TestAppController.js

    r222181 r224368  
    2626WI.TestAppController = class TestAppController extends WI.AppControllerBase
    2727{
    28     constructor()
    29     {
    30         super();
    31     }
    32 
    3328    get hasExtraDomains() { return false; }
    3429    get debuggableType() { return WI.DebuggableType.Web; }
  • trunk/Source/WebInspectorUI/UserInterface/Views/DashboardContainerView.css

    r216628 r224368  
    3838}
    3939
    40 body.javascript .toolbar .dashboard-container {
     40body:not(.web) .toolbar .dashboard-container {
    4141    width: 25vw;
    4242    min-width: 175px;
  • trunk/Source/WebInspectorUI/UserInterface/Views/DefaultDashboardView.css

    r223694 r224368  
    2828}
    2929
    30 body.javascript .toolbar .dashboard.default > :matches(.resourcesCount, .resourcesSize, .time) {
     30body:not(.web) .toolbar .dashboard.default > :matches(.resourcesCount, .resourcesSize, .time) {
    3131    display: none;
    3232}
  • trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js

    r223997 r224368  
    7171        this.contentTreeOutline.includeSourceMapResourceChildren = true;
    7272
    73         if (WI.sharedApp.debuggableType === WI.DebuggableType.JavaScript) {
     73        if (ResourceSidebarPanel.shouldPlaceResourcesAtTopLevel()) {
    7474            this.contentTreeOutline.disclosureButtons = false;
    7575            WI.SourceCode.addEventListener(WI.SourceCode.Event.SourceMapAdded, () => { this.contentTreeOutline.disclosureButtons = true; }, this);
    7676        }
     77    }
     78
     79    // Static
     80
     81    static shouldPlaceResourcesAtTopLevel()
     82    {
     83        return (WI.sharedApp.debuggableType === WI.DebuggableType.JavaScript && !WI.sharedApp.hasExtraDomains)
     84            || WI.sharedApp.debuggableType === WI.DebuggableType.ServiceWorker;
    7785    }
    7886
     
    198206            this._addScript(script);
    199207
    200             if (script.sourceMaps.length && WI.sharedApp.debuggableType === WI.DebuggableType.JavaScript)
     208            if (script.sourceMaps.length && ResourceSidebarPanel.shouldPlaceResourcesAtTopLevel())
    201209                this.contentTreeOutline.disclosureButtons = true;
    202210        }
     
    327335            parentFolderTreeElement = this._extensionScriptsFolderTreeElement;
    328336        } else {
    329             if (WI.sharedApp.debuggableType === WI.DebuggableType.JavaScript && !WI.sharedApp.hasExtraDomains)
     337            if (ResourceSidebarPanel.shouldPlaceResourcesAtTopLevel())
    330338                insertIntoTopLevel = true;
    331339            else {
     
    485493    _extraDomainsActivated()
    486494    {
    487         if (WI.sharedApp.debuggableType === WI.DebuggableType.JavaScript)
     495        if (ResourceSidebarPanel.shouldPlaceResourcesAtTopLevel())
    488496            this.contentTreeOutline.disclosureButtons = true;
    489497    }
  • trunk/Source/WebInspectorUI/UserInterface/Views/Toolbar.js

    r222181 r224368  
    101101            return;
    102102
    103         // Force collapsed style for JavaScript debuggables.
    104         if (WI.sharedApp.debuggableType === WI.DebuggableType.JavaScript) {
     103        // Force collapsed style for non-Web debuggables.
     104        if (WI.sharedApp.debuggableType !== WI.DebuggableType.Web) {
    105105            this.element.classList.add(WI.NavigationBar.CollapsedStyleClassName);
    106106            return;
  • trunk/Source/WebKit/ChangeLog

    r224358 r224368  
     12017-11-02  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Make ServiceWorker a Remote Inspector debuggable target
     4        https://bugs.webkit.org/show_bug.cgi?id=179043
     5        <rdar://problem/34126008>
     6
     7        Reviewed by Brian Burg.
     8
     9        * UIProcess/API/Cocoa/_WKRemoteWebInspectorViewController.h:
     10        * UIProcess/API/Cocoa/_WKRemoteWebInspectorViewController.mm:
     11        (debuggableTypeString):
     12        Provide a way to start a Remote Web Inspector frontend for a ServiceWorker target type.
     13
    1142017-11-02  Ryan Haddad  <ryanhaddad@apple.com>
    215
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKRemoteWebInspectorViewController.h

    r218444 r224368  
    3737typedef NS_ENUM(NSInteger, WKRemoteWebInspectorDebuggableType) {
    3838    WKRemoteWebInspectorDebuggableTypeJavaScript,
     39    WKRemoteWebInspectorDebuggableTypeServiceWorker WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)),
    3940    WKRemoteWebInspectorDebuggableTypeWeb,
    4041} WK_API_AVAILABLE(macosx(10.12.3), ios(10.3));
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKRemoteWebInspectorViewController.mm

    r205369 r224368  
    100100    case WKRemoteWebInspectorDebuggableTypeJavaScript:
    101101        return ASCIILiteral("javascript");
     102    case WKRemoteWebInspectorDebuggableTypeServiceWorker:
     103        return ASCIILiteral("service-worker");
    102104    case WKRemoteWebInspectorDebuggableTypeWeb:
    103105        return ASCIILiteral("web");
Note: See TracChangeset for help on using the changeset viewer.