[DevTools] (Re-)introduce SDK.Target.Type

We failed to abstract away the types with capabilities, so
I am bringing the type back in preparation of removing
service/shadow workers shadow page target.

Bug: 882467
Change-Id: I480bb18b1cfa9cf79e83435d735d102711991562
Reviewed-on: https://chromium-review.googlesource.com/c/1310759
Reviewed-by: Joel Einbinder <[email protected]>
Commit-Queue: Dmitry Gozman <[email protected]>
Cr-Original-Commit-Position: refs/heads/master@{#604446}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 1382cbcc0e916f8449d471dd54ca62aeb14db252
diff --git a/front_end/console/ConsoleContextSelector.js b/front_end/console/ConsoleContextSelector.js
index 56afa11..6ff70fc 100644
--- a/front_end/console/ConsoleContextSelector.js
+++ b/front_end/console/ConsoleContextSelector.js
@@ -107,13 +107,12 @@
     }
     let targetDepth = 0;
     while (target.parentTarget()) {
-      if (target.parentTarget().hasJSCapability()) {
-        targetDepth++;
-      } else {
+      if (target.parentTarget().type() === SDK.Target.Type.ServiceWorker) {
         // Special casing service workers to be top-level.
         targetDepth = 0;
         break;
       }
+      targetDepth++;
       target = target.parentTarget();
     }
     depth += targetDepth;
@@ -153,7 +152,7 @@
   _executionContextCreated(executionContext) {
     // FIXME(413886): We never want to show execution context for the main thread of shadow page in service/shared worker frontend.
     // This check could be removed once we do not send this context to frontend.
-    if (!executionContext.target().hasJSCapability())
+    if (executionContext.target().type() === SDK.Target.Type.ServiceWorker)
       return;
 
     this._items.insertWithComparator(executionContext, executionContext.runtimeModel.executionContextComparator());
diff --git a/front_end/inspector_main/InspectorMain.js b/front_end/inspector_main/InspectorMain.js
index 4666c81..51488d2 100644
--- a/front_end/inspector_main/InspectorMain.js
+++ b/front_end/inspector_main/InspectorMain.js
@@ -31,27 +31,19 @@
   }
 
   _connectAndCreateMainTarget() {
-    const isNodeJS = !!Runtime.queryParam('v8only');
+    const type = Runtime.queryParam('v8only') ? SDK.Target.Type.Node : SDK.Target.Type.Frame;
+    const capabilities = Runtime.queryParam('v8only') ? SDK.Target.Capability.JS :
+                                                        SDK.Target.Capability.Browser | SDK.Target.Capability.DOM |
+            SDK.Target.Capability.DeviceEmulation | SDK.Target.Capability.Emulation | SDK.Target.Capability.Input |
+            SDK.Target.Capability.JS | SDK.Target.Capability.Log | SDK.Target.Capability.Network |
+            SDK.Target.Capability.ScreenCapture | SDK.Target.Capability.Security | SDK.Target.Capability.Target |
+            SDK.Target.Capability.Tracing | SDK.Target.Capability.Inspector;
     const target = SDK.targetManager.createTarget(
-        'main', Common.UIString('Main'), this._capabilitiesForMainTarget(), this._createMainConnection.bind(this), null,
-        isNodeJS);
+        'main', Common.UIString('Main'), capabilities, type, this._createMainConnection.bind(this), null);
     target.runtimeAgent().runIfWaitingForDebugger();
   }
 
   /**
-   * @return {number}
-   */
-  _capabilitiesForMainTarget() {
-    if (Runtime.queryParam('v8only'))
-      return SDK.Target.Capability.JS;
-    return SDK.Target.Capability.Browser | SDK.Target.Capability.DOM | SDK.Target.Capability.DeviceEmulation |
-        SDK.Target.Capability.Emulation | SDK.Target.Capability.Input | SDK.Target.Capability.JS |
-        SDK.Target.Capability.Log | SDK.Target.Capability.Network | SDK.Target.Capability.ScreenCapture |
-        SDK.Target.Capability.Security | SDK.Target.Capability.Target | SDK.Target.Capability.Tracing |
-        SDK.Target.Capability.Inspector;
-  }
-
-  /**
    * @param {!Protocol.InspectorBackend.Connection.Params} params
    * @return {!Protocol.InspectorBackend.Connection}
    */
@@ -218,7 +210,7 @@
    * @param {!SDK.Target} target
    */
   _updateTarget(target) {
-    if (target.parentTarget())
+    if (target.type() !== SDK.Target.Type.Frame || target.parentTarget())
       return;
     target.pageAgent().setAdBlockingEnabled(this._adBlockEnabledSetting.get());
     target.emulationAgent().setFocusEmulationEnabled(this._emulatePageFocusSetting.get());
diff --git a/front_end/inspector_main/RequestAppBannerActionDelegate.js b/front_end/inspector_main/RequestAppBannerActionDelegate.js
index 8792584..9dc8491 100644
--- a/front_end/inspector_main/RequestAppBannerActionDelegate.js
+++ b/front_end/inspector_main/RequestAppBannerActionDelegate.js
@@ -14,7 +14,7 @@
    */
   handleAction(context, actionId) {
     const target = SDK.targetManager.mainTarget();
-    if (target && target.hasBrowserCapability()) {
+    if (target && target.type() === SDK.Target.Type.Frame) {
       target.pageAgent().requestAppBanner();
       Common.console.show();
     }
diff --git a/front_end/js_main/JsMain.js b/front_end/js_main/JsMain.js
index 59a109d..cd65b76 100644
--- a/front_end/js_main/JsMain.js
+++ b/front_end/js_main/JsMain.js
@@ -12,7 +12,8 @@
   run() {
     Host.userMetrics.actionTaken(Host.UserMetrics.Action.ConnectToNodeJSDirectly);
     const target = SDK.targetManager.createTarget(
-        'main', Common.UIString('Main'), SDK.Target.Capability.JS, this._createMainConnection.bind(this), null, true /* isNodeJS */);
+        'main', Common.UIString('Main'), SDK.Target.Capability.JS, SDK.Target.Type.Node,
+        this._createMainConnection.bind(this), null);
     target.runtimeAgent().runIfWaitingForDebugger();
     InspectorFrontendHost.connectionReady();
   }
diff --git a/front_end/main/Main.js b/front_end/main/Main.js
index 518fb19..0eb31b1 100644
--- a/front_end/main/Main.js
+++ b/front_end/main/Main.js
@@ -561,7 +561,7 @@
     }
 
     if (Components.dockController.dockSide() === Components.DockController.State.Undocked &&
-        SDK.targetManager.mainTarget() && SDK.targetManager.mainTarget().hasBrowserCapability())
+        SDK.targetManager.mainTarget() && SDK.targetManager.mainTarget().type() === SDK.Target.Type.Frame)
       contextMenu.defaultSection().appendAction('inspector_main.focus-debuggee', Common.UIString('Focus debuggee'));
 
     contextMenu.defaultSection().appendAction(
diff --git a/front_end/node_main/NodeMain.js b/front_end/node_main/NodeMain.js
index 3a2cb44..7c0f43c 100644
--- a/front_end/node_main/NodeMain.js
+++ b/front_end/node_main/NodeMain.js
@@ -12,8 +12,8 @@
   run() {
     Host.userMetrics.actionTaken(Host.UserMetrics.Action.ConnectToNodeJSFromFrontend);
     const target = SDK.targetManager.createTarget(
-        'main', Common.UIString('Main'), SDK.Target.Capability.Target, params => new SDK.MainConnection(params), null,
-        false /* isNodeJS */);
+        'main', Common.UIString('Main'), SDK.Target.Capability.Target, SDK.Target.Type.Browser,
+        params => new SDK.MainConnection(params), null);
     target.setInspectedURL('Node.js');
     InspectorFrontendHost.connectionReady();
   }
@@ -100,7 +100,7 @@
   attachedToTarget(sessionId, targetInfo, waitingForDebugger) {
     const target = this._targetManager.createTarget(
         targetInfo.targetId, Common.UIString('Node.js: %s', targetInfo.url), SDK.Target.Capability.JS,
-        this._createChildConnection.bind(this, this._targetAgent, sessionId), this._parentTarget, true /* isNodeJS */);
+        SDK.Target.Type.Node, this._createChildConnection.bind(this, this._targetAgent, sessionId), this._parentTarget);
     target.runtimeAgent().runIfWaitingForDebugger();
   }
 
diff --git a/front_end/persistence/Automapping.js b/front_end/persistence/Automapping.js
index 6a486db..bc64a00 100644
--- a/front_end/persistence/Automapping.js
+++ b/front_end/persistence/Automapping.js
@@ -219,7 +219,7 @@
 
       const target = Bindings.NetworkProject.targetForUISourceCode(status.network);
       let isValid = false;
-      if (target && target.isNodeJS()) {
+      if (target && target.type() === SDK.Target.Type.Node) {
         const rewrappedNetworkContent =
             Persistence.Persistence.rewrapNodeJSContent(status.fileSystem, fileSystemContent, networkContent);
         isValid = fileSystemContent === rewrappedNetworkContent;
diff --git a/front_end/persistence/Persistence.js b/front_end/persistence/Persistence.js
index 14accb9..fac5b99 100644
--- a/front_end/persistence/Persistence.js
+++ b/front_end/persistence/Persistence.js
@@ -178,7 +178,7 @@
     }
 
     const target = Bindings.NetworkProject.targetForUISourceCode(binding.network);
-    if (target.isNodeJS()) {
+    if (target.type() === SDK.Target.Type.Node) {
       const newContent = uiSourceCode.workingCopy();
       other.requestContent().then(() => {
         const nodeJSContent = Persistence.Persistence.rewrapNodeJSContent(other, other.workingCopy(), newContent);
@@ -221,7 +221,7 @@
       return;
     const other = binding.network === uiSourceCode ? binding.fileSystem : binding.network;
     const target = Bindings.NetworkProject.targetForUISourceCode(binding.network);
-    if (target.isNodeJS()) {
+    if (target.type() === SDK.Target.Type.Node) {
       other.requestContent().then(currentContent => {
         const nodeJSContent = Persistence.Persistence.rewrapNodeJSContent(other, currentContent, newContent);
         setContent.call(this, nodeJSContent);
diff --git a/front_end/protocol/InspectorBackend.js b/front_end/protocol/InspectorBackend.js
index c8f5919..168bab4 100644
--- a/front_end/protocol/InspectorBackend.js
+++ b/front_end/protocol/InspectorBackend.js
@@ -230,9 +230,9 @@
 Protocol.TargetBase = class extends Common.Object {
   /**
    * @param {!Protocol.InspectorBackend.Connection.Factory} connectionFactory
-   * @param {boolean} isNodeJS
+   * @param {boolean} needsNodeJSPatching
    */
-  constructor(connectionFactory, isNodeJS) {
+  constructor(connectionFactory, needsNodeJSPatching) {
     super();
     this._connection =
         connectionFactory({onMessage: this._onMessage.bind(this), onDisconnect: this._onDisconnect.bind(this)});
@@ -249,7 +249,7 @@
     }
     if (!Protocol.InspectorBackend.sendRawMessageForTesting)
       Protocol.InspectorBackend.sendRawMessageForTesting = this._sendRawMessageForTesting.bind(this);
-    this._isNodeJS = isNodeJS;
+    this._needsNodeJSPatching = needsNodeJSPatching;
   }
 
   /**
@@ -363,7 +363,8 @@
 
     const messageObject = /** @type {!Object} */ ((typeof message === 'string') ? JSON.parse(message) : message);
 
-    Protocol.NodeURL.patch(this, messageObject);
+    if (this._needsNodeJSPatching)
+      Protocol.NodeURL.patch(messageObject);
 
     if ('id' in messageObject) {  // just a response for some request
       const callback = this._callbacks[messageObject.id];
@@ -505,15 +506,8 @@
         0);
   }
 
-  /**
-   * @return {boolean}
-   */
-  isNodeJS() {
-    return this._isNodeJS;
-  }
-
   markAsNodeJSForTest() {
-    this._isNodeJS = true;
+    this._needsNodeJSPatching = true;
   }
 };
 
diff --git a/front_end/protocol/NodeURL.js b/front_end/protocol/NodeURL.js
index b4234cb..e69d057 100644
--- a/front_end/protocol/NodeURL.js
+++ b/front_end/protocol/NodeURL.js
@@ -4,12 +4,10 @@
 
 Protocol.NodeURL = class {
   /**
-   * @param {!Protocol.TargetBase} target
    * @param {!Object} object
    */
-  static patch(target, object) {
-    if (target.isNodeJS())
-      process(object, '');
+  static patch(object) {
+    process(object, '');
 
     /**
      * @param {!Object} object
diff --git a/front_end/resources/AppManifestView.js b/front_end/resources/AppManifestView.js
index 6057f58..58cef46 100644
--- a/front_end/resources/AppManifestView.js
+++ b/front_end/resources/AppManifestView.js
@@ -159,7 +159,7 @@
    */
   _addToHomescreen(event) {
     const target = SDK.targetManager.mainTarget();
-    if (target && target.hasBrowserCapability()) {
+    if (target && target.type() === SDK.Target.Type.Frame) {
       target.pageAgent().requestAppBanner();
       Common.console.show();
     }
diff --git a/front_end/sdk/ChildTargetManager.js b/front_end/sdk/ChildTargetManager.js
index 81d17a9..c1bfde8 100644
--- a/front_end/sdk/ChildTargetManager.js
+++ b/front_end/sdk/ChildTargetManager.js
@@ -62,25 +62,6 @@
   }
 
   /**
-   * @param {string} type
-   * @return {number}
-   */
-  _capabilitiesForType(type) {
-    if (type === 'worker') {
-      return SDK.Target.Capability.JS | SDK.Target.Capability.Log | SDK.Target.Capability.Network |
-          SDK.Target.Capability.Target;
-    }
-    if (type === 'service_worker')
-      return SDK.Target.Capability.Log | SDK.Target.Capability.Network | SDK.Target.Capability.Target;
-    if (type === 'iframe') {
-      return SDK.Target.Capability.Browser | SDK.Target.Capability.DOM | SDK.Target.Capability.JS |
-          SDK.Target.Capability.Log | SDK.Target.Capability.Network | SDK.Target.Capability.Target |
-          SDK.Target.Capability.Tracing | SDK.Target.Capability.Emulation | SDK.Target.Capability.Input;
-    }
-    return 0;
-  }
-
-  /**
    * @override
    * @param {!Protocol.Target.TargetInfo} targetInfo
    */
@@ -134,9 +115,29 @@
       targetName = parsedURL ? parsedURL.lastPathComponentWithFragment() :
                                '#' + (++SDK.ChildTargetManager._lastAnonymousTargetId);
     }
+
+    let type = SDK.Target.Type.Browser;
+    let capabilities = 0;
+
+    if (targetInfo.type === 'iframe') {
+      type = SDK.Target.Type.Frame;
+      capabilities = SDK.Target.Capability.Browser | SDK.Target.Capability.DOM | SDK.Target.Capability.JS |
+          SDK.Target.Capability.Log | SDK.Target.Capability.Network | SDK.Target.Capability.Target |
+          SDK.Target.Capability.Tracing | SDK.Target.Capability.Emulation | SDK.Target.Capability.Input;
+    }
+    if (targetInfo.type === 'worker') {
+      type = SDK.Target.Type.Worker;
+      capabilities = SDK.Target.Capability.JS | SDK.Target.Capability.Log | SDK.Target.Capability.Network |
+          SDK.Target.Capability.Target;
+    }
+    if (targetInfo.type === 'service_worker') {
+      type = SDK.Target.Type.ServiceWorker;
+      capabilities = SDK.Target.Capability.Log | SDK.Target.Capability.Network | SDK.Target.Capability.Target;
+    }
+
     const target = this._targetManager.createTarget(
-        targetInfo.targetId, targetName, this._capabilitiesForType(targetInfo.type),
-        this._createChildConnection.bind(this, this._targetAgent, sessionId), this._parentTarget, false /* isNodeJS */);
+        targetInfo.targetId, targetName, capabilities, type,
+        this._createChildConnection.bind(this, this._targetAgent, sessionId), this._parentTarget);
 
     if (SDK.ChildTargetManager._attachCallback) {
       SDK.ChildTargetManager._attachCallback({target, waitingForDebugger}).then(() => {
diff --git a/front_end/sdk/DebuggerModel.js b/front_end/sdk/DebuggerModel.js
index 85a574e..039ac57 100644
--- a/front_end/sdk/DebuggerModel.js
+++ b/front_end/sdk/DebuggerModel.js
@@ -260,7 +260,7 @@
   async setBreakpointByURL(url, lineNumber, columnNumber, condition) {
     // Convert file url to node-js path.
     let urlRegex;
-    if (this.target().isNodeJS()) {
+    if (this.target().type() === SDK.Target.Type.Node) {
       const platformPath = Common.ParsedURL.urlToPlatformPath(url, Host.isWin());
       urlRegex = `${platformPath.escapeForRegExp()}|${url.escapeForRegExp()}`;
     }
diff --git a/front_end/sdk/RuntimeModel.js b/front_end/sdk/RuntimeModel.js
index a8da06a..3262081 100644
--- a/front_end/sdk/RuntimeModel.js
+++ b/front_end/sdk/RuntimeModel.js
@@ -695,10 +695,12 @@
      */
     function targetWeight(target) {
       if (!target.parentTarget())
+        return 5;
+      if (target.type() === SDK.Target.Type.Frame)
         return 4;
-      if (target.hasBrowserCapability())
+      if (target.type() === SDK.Target.Type.ServiceWorker)
         return 3;
-      if (target.hasJSCapability())
+      if (target.type() === SDK.Target.Type.Worker)
         return 2;
       return 1;
     }
diff --git a/front_end/sdk/ServiceWorkerManager.js b/front_end/sdk/ServiceWorkerManager.js
index bbe4f76..4a6e908 100644
--- a/front_end/sdk/ServiceWorkerManager.js
+++ b/front_end/sdk/ServiceWorkerManager.js
@@ -580,7 +580,7 @@
     const parent = target.parentTarget();
     if (!parent || parent.parentTarget() !== this._target)
       return null;
-    return parent.id();
+    return parent.type() === SDK.Target.Type.ServiceWorker ? parent.id() : null;
   }
 
   _updateAllContextLabels() {
diff --git a/front_end/sdk/Target.js b/front_end/sdk/Target.js
index 9ed9f30..a753051 100644
--- a/front_end/sdk/Target.js
+++ b/front_end/sdk/Target.js
@@ -13,17 +13,20 @@
    * @param {string} id
    * @param {string} name
    * @param {number} capabilitiesMask
+   * @param {!SDK.Target.Type} type
    * @param {!Protocol.InspectorBackend.Connection.Factory} connectionFactory
    * @param {?SDK.Target} parentTarget
    * @param {boolean} suspended
-   * @param {boolean} isNodeJS
    */
-  constructor(targetManager, id, name, capabilitiesMask, connectionFactory, parentTarget, suspended, isNodeJS) {
-    super(connectionFactory, isNodeJS);
+  constructor(targetManager, id, name, capabilitiesMask, type, connectionFactory, parentTarget, suspended) {
+    const needsNodeJSPatching = type === SDK.Target.Type.Node;
+    super(connectionFactory, needsNodeJSPatching);
     this._targetManager = targetManager;
     this._name = name;
     this._inspectedURL = '';
+    // TODO(dgozman): specify capabilities per type here, instead of passing them.
     this._capabilitiesMask = capabilitiesMask;
+    this._type = type;
     this._parentTarget = parentTarget;
     this._id = id;
     this._modelByConstructor = new Map();
@@ -58,6 +61,21 @@
   }
 
   /**
+   * @return {!SDK.Target.Type}
+   */
+  type() {
+    return this._type;
+  }
+
+  /**
+   * @override
+   */
+  markAsNodeJSForTest() {
+    super.markAsNodeJSForTest();
+    this._type = SDK.Target.Type.Node;
+  }
+
+  /**
    * @return {!SDK.TargetManager}
    */
   targetManager() {
@@ -69,6 +87,8 @@
    * @return {boolean}
    */
   hasAllCapabilities(capabilitiesMask) {
+    // TODO(dgozman): get rid of this method, once we never observe targets with
+    // capability mask.
     return (this._capabilitiesMask & capabilitiesMask) === capabilitiesMask;
   }
 
@@ -77,49 +97,8 @@
    * @return {string}
    */
   decorateLabel(label) {
-    return !this.hasBrowserCapability() ? '\u2699 ' + label : label;
-  }
-
-  /**
-   * @return {boolean}
-   */
-  hasBrowserCapability() {
-    return this.hasAllCapabilities(SDK.Target.Capability.Browser);
-  }
-
-  /**
-   * @return {boolean}
-   */
-  hasJSCapability() {
-    return this.hasAllCapabilities(SDK.Target.Capability.JS);
-  }
-
-  /**
-   * @return {boolean}
-   */
-  hasLogCapability() {
-    return this.hasAllCapabilities(SDK.Target.Capability.Log);
-  }
-
-  /**
-   * @return {boolean}
-   */
-  hasNetworkCapability() {
-    return this.hasAllCapabilities(SDK.Target.Capability.Network);
-  }
-
-  /**
-   * @return {boolean}
-   */
-  hasTargetCapability() {
-    return this.hasAllCapabilities(SDK.Target.Capability.Target);
-  }
-
-  /**
-   * @return {boolean}
-   */
-  hasDOMCapability() {
-    return this.hasAllCapabilities(SDK.Target.Capability.DOM);
+    return (this._type === SDK.Target.Type.Worker || this._type === SDK.Target.Type.ServiceWorker) ? '\u2699 ' + label :
+                                                                                                     label;
   }
 
   /**
@@ -246,6 +225,17 @@
 };
 
 /**
+ * @enum {string}
+ */
+SDK.Target.Type = {
+  Frame: 'frame',
+  ServiceWorker: 'service-worker',
+  Worker: 'worker',
+  Node: 'node',
+  Browser: 'browser',
+};
+
+/**
  * @unrestricted
  */
 SDK.SDKModel = class extends Common.Object {
diff --git a/front_end/sdk/TargetManager.js b/front_end/sdk/TargetManager.js
index bf2bad7..c1d0d50 100644
--- a/front_end/sdk/TargetManager.js
+++ b/front_end/sdk/TargetManager.js
@@ -172,14 +172,14 @@
    * @param {string} id
    * @param {string} name
    * @param {number} capabilitiesMask
+   * @param {!SDK.Target.Type} type
    * @param {!Protocol.InspectorBackend.Connection.Factory} connectionFactory
    * @param {?SDK.Target} parentTarget
-   * @param {boolean} isNodeJS
    * @return {!SDK.Target}
    */
-  createTarget(id, name, capabilitiesMask, connectionFactory, parentTarget, isNodeJS) {
+  createTarget(id, name, capabilitiesMask, type, connectionFactory, parentTarget) {
     const target =
-        new SDK.Target(this, id, name, capabilitiesMask, connectionFactory, parentTarget, this._isSuspended, isNodeJS);
+        new SDK.Target(this, id, name, capabilitiesMask, type, connectionFactory, parentTarget, this._isSuspended);
     target.createModels(new Set(this._modelObservers.keysArray()));
     this._targets.push(target);
 
diff --git a/front_end/sdk_test_runner/PageMockTestRunner.js b/front_end/sdk_test_runner/PageMockTestRunner.js
index d062f78..e1e522f 100644
--- a/front_end/sdk_test_runner/PageMockTestRunner.js
+++ b/front_end/sdk_test_runner/PageMockTestRunner.js
@@ -15,7 +15,8 @@
 
 SDKTestRunner.connectToPage = function(targetName, pageMock, makeMainTarget) {
   const mockTarget = SDK.targetManager.createTarget(
-      nextId('mock-target-'), targetName, pageMock.capabilities(), params => pageMock.createConnection(params));
+      nextId('mock-target-'), targetName, pageMock.capabilities(), SDK.Target.Type.Frame,
+      params => pageMock.createConnection(params));
 
   if (makeMainTarget) {
     SDK.targetManager._targets = SDK.targetManager._targets.filter(target => target !== mockTarget);
diff --git a/front_end/sources/NavigatorView.js b/front_end/sources/NavigatorView.js
index 668372b..a2016ca 100644
--- a/front_end/sources/NavigatorView.js
+++ b/front_end/sources/NavigatorView.js
@@ -527,7 +527,8 @@
     if (!targetNode) {
       targetNode = new Sources.NavigatorGroupTreeNode(
           this, project, 'target:' + target.id(),
-          !target.hasBrowserCapability() ? Sources.NavigatorView.Types.Worker : Sources.NavigatorView.Types.Frame,
+          target.type() === SDK.Target.Type.Frame ? Sources.NavigatorView.Types.Frame :
+                                                    Sources.NavigatorView.Types.Worker,
           target.name());
       this._rootNode.appendChild(targetNode);
     }
diff --git a/front_end/test_runner/TestRunner.js b/front_end/test_runner/TestRunner.js
index 38f6d19..292ed22 100644
--- a/front_end/test_runner/TestRunner.js
+++ b/front_end/test_runner/TestRunner.js
@@ -1225,7 +1225,7 @@
  * @return {boolean}
  */
 TestRunner.isDedicatedWorker = function(target) {
-  return target && !target.hasBrowserCapability() && target.hasJSCapability() && target.hasLogCapability();
+  return target && target.type() === SDK.Target.Type.Worker;
 };
 
 /**
@@ -1233,8 +1233,7 @@
  * @return {boolean}
  */
 TestRunner.isServiceWorker = function(target) {
-  return target && !target.hasBrowserCapability() && !target.hasJSCapability() && target.hasNetworkCapability() &&
-      target.hasTargetCapability();
+  return target && target.type() === SDK.Target.Type.ServiceWorker;
 };
 
 /**
@@ -1242,13 +1241,17 @@
  * @return {string}
  */
 TestRunner.describeTargetType = function(target) {
-  if (TestRunner.isDedicatedWorker(target))
+  if (!target)
+    return 'browser';
+  if (target.type() === SDK.Target.Type.Worker)
     return 'worker';
-  if (TestRunner.isServiceWorker(target))
+  if (target.type() === SDK.Target.Type.ServiceWorker)
     return 'service-worker';
-  if (!target.parentTarget())
-    return 'page';
-  return 'frame';
+  if (target.type() === SDK.Target.Type.Frame)
+    return target.parentTarget() ? 'frame' : 'page';
+  if (target.type() === SDK.Target.Type.Node)
+    return 'node';
+  return 'browser';
 };
 
 /**
diff --git a/front_end/worker_main/WorkerMain.js b/front_end/worker_main/WorkerMain.js
index 2915747..2a1fe31 100644
--- a/front_end/worker_main/WorkerMain.js
+++ b/front_end/worker_main/WorkerMain.js
@@ -13,7 +13,8 @@
     const capabilities = SDK.Target.Capability.Browser | SDK.Target.Capability.Log | SDK.Target.Capability.Network |
         SDK.Target.Capability.Target | SDK.Target.Capability.Inspector;
     SDK.targetManager.createTarget(
-        'main', Common.UIString('Main'), capabilities, this._createMainConnection.bind(this), null, false /* isNodeJS */);
+        'main', Common.UIString('Main'), capabilities, SDK.Target.Type.ServiceWorker,
+        this._createMainConnection.bind(this), null);
     InspectorFrontendHost.connectionReady();
     new MobileThrottling.NetworkPanelIndicator();
   }
@@ -28,9 +29,8 @@
 };
 
 SDK.ChildTargetManager.install(async ({target, waitingForDebugger}) => {
-  const parentTarget = target.parentTarget();
   // Only pause the new worker if debugging SW - we are going through the pause on start checkbox.
-  if (parentTarget.parentTarget() || !waitingForDebugger)
+  if (target.parentTarget().type() !== SDK.Target.Type.ServiceWorker || !waitingForDebugger)
     return;
   const debuggerModel = target.model(SDK.DebuggerModel);
   if (!debuggerModel)