Bug 1588999 - Rename ObjectClient to ObjectFront. r=ochameau.
authorNicolas Chevobbe <nchevobbe@mozilla.com>
Mon, 21 Oct 2019 12:07:10 +0000
changeset 498358 f1453e41758bef4f4e9318c89adb8d7d1e6cd93b
parent 498357 f473602d0d244b9b50b08cd909c3a0fe3f8ec148
child 498359 a0b6647eea52490282fad35f2cf3eb3d56193b26
push id36717
push usernbeleuzu@mozilla.com
push dateMon, 21 Oct 2019 21:51:55 +0000
treeherdermozilla-central@563f437f24b9 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersochameau
bugs1588999
milestone71.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1588999 - Rename ObjectClient to ObjectFront. r=ochameau. The object-client.js file is now a proper protocol.js front, but is still named after a client. This is confusing, so we rename and move the file next to other fronts, and update all consumers to the new terminology. Differential Revision: https://phabricator.services.mozilla.com/D49878
devtools/client/debugger/packages/devtools-reps/src/launchpad/actions/expressions.js
devtools/client/debugger/packages/devtools-reps/src/launchpad/index.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/actions.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/__mocks__/object-client.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/__mocks__/object-front.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/__snapshots__/entries.js.snap
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/basic.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/classnames.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/create-long-string-client.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/create-object-client.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/entries.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/events.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/expand.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/function.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/getter-setter.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/keyboard-navigation.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/properties.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/proxy.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/release-actors.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/should-item-update.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/window.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/types.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/utils/client.js
devtools/client/debugger/packages/devtools-reps/src/object-inspector/utils/load-properties.js
devtools/client/debugger/src/client/firefox.js
devtools/client/debugger/src/client/firefox/commands.js
devtools/client/debugger/src/client/firefox/types.js
devtools/client/debugger/src/components/Editor/Preview/Popup.js
devtools/client/debugger/src/components/SecondaryPanes/Expressions.js
devtools/client/debugger/src/components/SecondaryPanes/Scopes.js
devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap
devtools/client/debugger/src/utils/pause/mapScopes/buildGeneratedBindingList.js
devtools/client/debugger/src/utils/pause/mapScopes/findGeneratedBindingFromPosition.js
devtools/client/dom/panel.js
devtools/client/inspector/extensions/types.js
devtools/client/inspector/inspector.js
devtools/client/inspector/store.js
devtools/client/scratchpad/scratchpad.js
devtools/client/shared/components/reps/reps.js
devtools/client/shared/widgets/VariablesViewController.jsm
devtools/client/webconsole/commands.js
devtools/client/webconsole/test/browser/browser_console_cpow.js
devtools/client/webconsole/test/node/mocha-test-setup.js
devtools/docs/backend/client-api.md
devtools/server/tests/unit/head_dbg.js
devtools/server/tests/unit/test_objectgrips-13.js
devtools/server/tests/unit/test_objectgrips-21.js
devtools/server/tests/unit/test_threadlifetime-02.js
devtools/shared/client/debugger-client.js
devtools/shared/client/deprecated-thread-client.js
devtools/shared/client/moz.build
devtools/shared/client/object-client.js
devtools/shared/fronts/moz.build
devtools/shared/fronts/object.js
devtools/shared/fronts/property-iterator.js
devtools/shared/fronts/thread.js
devtools/shared/webconsole/test/common.js
devtools/shared/webconsole/test/test_bug819670_getter_throws.html
devtools/shared/webconsole/test/test_object_actor.html
devtools/shared/webconsole/test/test_object_actor_native_getters.html
devtools/shared/webconsole/test/test_object_actor_native_getters_lenient_this.html
tools/lint/eslint/modules.json
--- a/devtools/client/debugger/packages/devtools-reps/src/launchpad/actions/expressions.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/launchpad/actions/expressions.js
@@ -42,19 +42,19 @@ function showResultPacket(key) {
 
 function hideResultPacket(key) {
   return {
     key,
     type: constants.HIDE_RESULT_PACKET,
   };
 }
 
-function createObjectClient(grip) {
+function createObjectFront(grip) {
   return function({ dispatch, client }) {
-    return client.getObjectClient(grip);
+    return client.getObjectFront(grip);
   };
 }
 
 function createLongStringClient(grip) {
   return function({ dispatch, client }) {
     return client.getLongStringClient(grip);
   };
 }
@@ -65,12 +65,12 @@ function releaseActor(actor) {
   };
 }
 module.exports = {
   addExpression,
   clearExpressions,
   evaluateInput,
   showResultPacket,
   hideResultPacket,
-  createObjectClient,
+  createObjectFront,
   createLongStringClient,
   releaseActor,
 };
--- a/devtools/client/debugger/packages/devtools-reps/src/launchpad/index.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/launchpad/index.js
@@ -22,17 +22,17 @@ function onConnect(connection) {
   }
 
   const client = {
     clientCommands: {
       evaluate: input =>
         connection.tabConnection.tabTarget.activeConsole.evaluateJSAsync(input),
     },
 
-    createObjectClient: function(grip) {
+    createObjectFront: function(grip) {
       return connection.tabConnection.threadFront.pauseGrip(grip);
     },
     createLongStringClient: function(grip) {
       return connection.tabConnection.tabTarget.activeConsole.longString(grip);
     },
     releaseActor: function(actor) {
       const debuggerClient = connection.tabConnection.debuggerClient;
       const objFront = debuggerClient.getFrontByID(actor);
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/actions.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/actions.js
@@ -32,17 +32,17 @@ function nodeCollapse(node: Node) {
   return {
     type: "NODE_COLLAPSE",
     data: { node },
   };
 }
 
 /*
  * This action checks if we need to fetch properties, entries, prototype and
- * symbols for a given node. If we do, it will call the appropriate ObjectClient
+ * symbols for a given node. If we do, it will call the appropriate ObjectFront
  * functions.
  */
 function nodeLoadProperties(node: Node, actor) {
   return async ({ dispatch, client, getState }: ThunkArg) => {
     const state = getState();
     const loadedProperties = getLoadedProperties(state);
     if (loadedProperties.has(node.path)) {
       return;
@@ -179,21 +179,18 @@ async function releaseActors(state, clie
 function invokeGetter(
   node: Node,
   targetGrip: object,
   receiverId: string | null,
   getterName: string
 ) {
   return async ({ dispatch, client, getState }: ThunkArg) => {
     try {
-      const objectClient = client.createObjectClient(targetGrip);
-      const result = await objectClient.getPropertyValue(
-        getterName,
-        receiverId
-      );
+      const objectFront = client.createObjectFront(targetGrip);
+      const result = await objectFront.getPropertyValue(getterName, receiverId);
       dispatch({
         type: "GETTER_INVOKED",
         data: {
           node,
           result,
         },
       });
     } catch (e) {
rename from devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/__mocks__/object-client.js
rename to devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/__mocks__/object-front.js
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/__mocks__/object-client.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/__mocks__/object-front.js
@@ -1,35 +1,35 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
-function ObjectClient(grip, overrides) {
+function ObjectFront(grip, overrides) {
   return {
     grip,
     enumEntries: function() {
-      return Promise.resolve({
-        iterator: this.getIterator({
+      return Promise.resolve(
+        this.getIterator({
           ownProperties: {},
-        }),
-      });
+        })
+      );
     },
     enumProperties: function(options) {
-      return Promise.resolve({
-        iterator: this.getIterator({
+      return Promise.resolve(
+        this.getIterator({
           ownProperties: {},
-        }),
-      });
+        })
+      );
     },
     enumSymbols: function() {
-      return Promise.resolve({
-        iterator: this.getIterator({
+      return Promise.resolve(
+        this.getIterator({
           ownSymbols: [],
-        }),
-      });
+        })
+      );
     },
     getPrototype: function() {
       return Promise.resolve({
         prototype: {},
       });
     },
     // Declared here so we can override it.
     getIterator(res) {
@@ -38,9 +38,9 @@ function ObjectClient(grip, overrides) {
           return Promise.resolve(res);
         },
       };
     },
     ...overrides,
   };
 }
 
-module.exports = ObjectClient;
+module.exports = ObjectFront;
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/__snapshots__/entries.js.snap
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/__snapshots__/entries.js.snap
@@ -1,18 +1,18 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`ObjectInspector - entries calls ObjectClient.enumEntries when expected 1`] = `
+exports[`ObjectInspector - entries calls ObjectFront.enumEntries when expected 1`] = `
 "
 ▼ Map(11)
 |  ▶︎ <entries>
 "
 `;
 
-exports[`ObjectInspector - entries calls ObjectClient.enumEntries when expected 2`] = `
+exports[`ObjectInspector - entries calls ObjectFront.enumEntries when expected 2`] = `
 "
   ▼ Map(11)
 [ |  ▼ <entries> ]
   |  |  ▶︎ 0: \\"key-0\\" → \\"value-0\\"
   |  |  ▶︎ 1: \\"key-1\\" → \\"value-1\\"
   |  |  ▶︎ 2: \\"key-2\\" → \\"value-2\\"
   |  |  ▶︎ 3: \\"key-3\\" → \\"value-3\\"
   |  |  ▶︎ 4: \\"key-4\\" → \\"value-4\\"
@@ -20,24 +20,24 @@ exports[`ObjectInspector - entries calls
   |  |  ▶︎ 6: \\"key-6\\" → \\"value-6\\"
   |  |  ▶︎ 7: \\"key-7\\" → \\"value-7\\"
   |  |  ▶︎ 8: \\"key-8\\" → \\"value-8\\"
   |  |  ▶︎ 9: \\"key-9\\" → \\"value-9\\"
   |  |  ▶︎ 10: \\"key-10\\" → \\"value-10\\"
 "
 `;
 
-exports[`ObjectInspector - entries calls ObjectClient.enumEntries when expected 3`] = `
+exports[`ObjectInspector - entries calls ObjectFront.enumEntries when expected 3`] = `
 "
   ▼ Map(11)
 [ |  ▶︎ <entries> ]
 "
 `;
 
-exports[`ObjectInspector - entries calls ObjectClient.enumEntries when expected 4`] = `
+exports[`ObjectInspector - entries calls ObjectFront.enumEntries when expected 4`] = `
 "
   ▼ Map(11)
 [ |  ▼ <entries> ]
   |  |  ▶︎ 0: \\"key-0\\" → \\"value-0\\"
   |  |  ▶︎ 1: \\"key-1\\" → \\"value-1\\"
   |  |  ▶︎ 2: \\"key-2\\" → \\"value-2\\"
   |  |  ▶︎ 3: \\"key-3\\" → \\"value-3\\"
   |  |  ▶︎ 4: \\"key-4\\" → \\"value-4\\"
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/basic.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/basic.js
@@ -8,29 +8,29 @@ const { createNode, NODE_TYPES } = requi
 const repsPath = "../../../reps";
 const { MODE } = require(`${repsPath}/constants`);
 const { Rep } = require(`${repsPath}/rep`);
 const {
   formatObjectInspector,
   waitForDispatch,
   waitForLoadedProperties,
 } = require("../test-utils");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 const gripRepStubs = require(`${repsPath}/stubs/grip`);
 
 function generateDefaults(overrides) {
   return {
     autoExpandDepth: 0,
     ...overrides,
   };
 }
 
 function mountOI(props, { initialState } = {}) {
   const client = {
-    createObjectClient: grip => ObjectClient(grip),
+    createObjectFront: grip => ObjectFront(grip),
   };
 
   const obj = mountObjectInspector({
     client,
     props: generateDefaults(props),
     initialState: {
       objectInspector: {
         ...initialState,
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/classnames.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/classnames.js
@@ -1,13 +1,13 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 const { mountObjectInspector } = require("../test-utils");
 
 function generateDefaults(overrides) {
   return {
     autoExpandDepth: 0,
     roots: [
       {
         path: "root",
@@ -15,17 +15,17 @@ function generateDefaults(overrides) {
         contents: { value: 42 },
       },
     ],
     ...overrides,
   };
 }
 
 function mount(props) {
-  const client = { createObjectClient: grip => ObjectClient(grip) };
+  const client = { createObjectFront: grip => ObjectFront(grip) };
 
   return mountObjectInspector({
     client,
     props: generateDefaults(props),
   });
 }
 
 describe("ObjectInspector - classnames", () => {
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/create-long-string-client.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/create-long-string-client.js
@@ -1,26 +1,26 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 /* global jest */
 
 const { mountObjectInspector } = require("../test-utils");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 const LongStringClient = require("../__mocks__/long-string-client");
 
 const repsPath = "../../../reps";
 const longStringStubs = require(`${repsPath}/stubs/long-string`);
 
 function mount(props) {
   const substring = jest.fn(() => Promise.resolve({ fullText: "" }));
 
   const client = {
-    createObjectClient: grip => ObjectClient(grip),
+    createObjectFront: grip => ObjectFront(grip),
     createLongStringClient: jest.fn(grip =>
       LongStringClient(grip, { substring })
     ),
   };
 
   const obj = mountObjectInspector({
     client,
     props,
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/create-object-client.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/create-object-client.js
@@ -1,112 +1,112 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 /* global jest */
 
 const { mountObjectInspector } = require("../test-utils");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 
 const {
   createNode,
   makeNodesForEntries,
   makeNumericalBuckets,
 } = require("../../utils/node");
 
 const repsPath = "../../../reps";
 const gripRepStubs = require(`${repsPath}/stubs/grip`);
 const gripArrayRepStubs = require(`${repsPath}/stubs/grip-array`);
 
 function mount(props, overrides = {}) {
   const client = {
-    createObjectClient:
-      overrides.createObjectClient || jest.fn(grip => ObjectClient(grip)),
+    createObjectFront:
+      overrides.createObjectFront || jest.fn(grip => ObjectFront(grip)),
   };
 
   return mountObjectInspector({
     client,
     props,
   });
 }
 
-describe("createObjectClient", () => {
+describe("createObjectFront", () => {
   it("is called with the expected object for regular node", () => {
     const stub = gripRepStubs.get("testMoreThanMaxProps");
     const { client } = mount({
       autoExpandDepth: 1,
       roots: [
         {
           path: "root",
           contents: {
             value: stub,
           },
         },
       ],
     });
 
-    expect(client.createObjectClient.mock.calls[0][0]).toBe(stub);
+    expect(client.createObjectFront.mock.calls[0][0]).toBe(stub);
   });
 
   it("is called with the expected object for entries node", () => {
     const grip = Symbol();
     const mapStubNode = createNode({
       name: "map",
       contents: { value: grip },
     });
     const entriesNode = makeNodesForEntries(mapStubNode);
 
     const { client } = mount({
       autoExpandDepth: 1,
       roots: [entriesNode],
     });
 
-    expect(client.createObjectClient.mock.calls[0][0]).toBe(grip);
+    expect(client.createObjectFront.mock.calls[0][0]).toBe(grip);
   });
 
   it("is called with the expected object for bucket node", () => {
     const grip = gripArrayRepStubs.get("testMaxProps");
     const root = createNode({ name: "root", contents: { value: grip } });
     const [bucket] = makeNumericalBuckets(root);
 
     const { client } = mount({
       autoExpandDepth: 1,
       roots: [bucket],
     });
-    expect(client.createObjectClient.mock.calls[0][0]).toBe(grip);
+    expect(client.createObjectFront.mock.calls[0][0]).toBe(grip);
   });
 
   it("is called with the expected object for sub-bucket node", () => {
     const grip = gripArrayRepStubs.get("testMaxProps");
     const root = createNode({ name: "root", contents: { value: grip } });
     const [bucket] = makeNumericalBuckets(root);
     const [subBucket] = makeNumericalBuckets(bucket);
 
     const { client } = mount({
       autoExpandDepth: 1,
       roots: [subBucket],
     });
 
-    expect(client.createObjectClient.mock.calls[0][0]).toBe(grip);
+    expect(client.createObjectFront.mock.calls[0][0]).toBe(grip);
   });
 
-  it("doesn't fail when ObjectClient doesn't have expected methods", () => {
+  it("doesn't fail when ObjectFront doesn't have expected methods", () => {
     const stub = gripRepStubs.get("testMoreThanMaxProps");
     const root = createNode({ name: "root", contents: { value: stub } });
 
     // Override console.error so we don't spam test results.
     const originalConsoleError = console.error;
     console.error = () => {};
 
-    const createObjectClient = x => ({});
+    const createObjectFront = x => ({});
     mount(
       {
         autoExpandDepth: 1,
         roots: [root],
       },
-      { createObjectClient }
+      { createObjectFront }
     );
 
     // rollback console.error.
     console.error = originalConsoleError;
   });
 });
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/entries.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/entries.js
@@ -8,39 +8,37 @@ const { mountObjectInspector } = require
 const { MODE } = require("../../../reps/constants");
 const {
   formatObjectInspector,
   waitForDispatch,
   waitForLoadedProperties,
 } = require("../test-utils");
 const gripMapRepStubs = require("../../../reps/stubs/grip-map");
 const mapStubs = require("../../stubs/map");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 
 function generateDefaults(overrides) {
   return {
     autoExpandDepth: 0,
-    createObjectClient: grip => ObjectClient(grip),
+    createObjectFront: grip => ObjectFront(grip),
     ...overrides,
   };
 }
 
 function getEnumEntriesMock() {
   return jest.fn(() => ({
-    iterator: {
-      slice: () => mapStubs.get("11-entries"),
-    },
+    slice: () => mapStubs.get("11-entries"),
   }));
 }
 
 function mount(props, { initialState }) {
   const enumEntries = getEnumEntriesMock();
 
   const client = {
-    createObjectClient: grip => ObjectClient(grip, { enumEntries }),
+    createObjectFront: grip => ObjectFront(grip, { enumEntries }),
   };
   const obj = mountObjectInspector({
     client,
     props: generateDefaults(props),
     initialState: {
       objectInspector: {
         ...initialState,
         evaluations: new Map(),
@@ -81,17 +79,17 @@ describe("ObjectInspector - entries", ()
     wrapper.update();
     expect(formatObjectInspector(wrapper)).toMatchSnapshot();
 
     // enumEntries shouldn't have been called since everything
     // is already in the preview property.
     expect(enumEntries.mock.calls).toHaveLength(0);
   });
 
-  it("calls ObjectClient.enumEntries when expected", async () => {
+  it("calls ObjectFront.enumEntries when expected", async () => {
     const stub = gripMapRepStubs.get("testMoreThanMaxEntries");
 
     const { wrapper, store, enumEntries } = mount(
       {
         autoExpandDepth: 1,
         injectWaitService: true,
         roots: [
           {
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/events.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/events.js
@@ -1,27 +1,27 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 /* global jest */
 const { mountObjectInspector } = require("../test-utils");
 
 const gripRepStubs = require("../../../reps/stubs/grip");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 
 function generateDefaults(overrides) {
   return {
     autoExpandDepth: 0,
     ...overrides,
   };
 }
 
 function mount(props) {
-  const client = { createObjectClient: grip => ObjectClient(grip) };
+  const client = { createObjectFront: grip => ObjectFront(grip) };
 
   return mountObjectInspector({
     client,
     props: generateDefaults(props),
   });
 }
 
 describe("ObjectInspector - properties", () => {
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/expand.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/expand.js
@@ -1,16 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 const { mountObjectInspector } = require("../test-utils");
 
 const repsPath = "../../../reps";
 const { MODE } = require(`${repsPath}/constants`);
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 const gripRepStubs = require(`${repsPath}/stubs/grip`);
 const gripPropertiesStubs = require("../../stubs/grip");
 const {
   formatObjectInspector,
   storeHasExactExpandedPaths,
   storeHasExpandedPath,
   storeHasLoadedProperty,
   waitForDispatch,
@@ -38,27 +38,27 @@ function generateDefaults(overrides) {
       },
       {
         path: "root-2",
         contents: {
           value: gripRepStubs.get("testProxy"),
         },
       },
     ],
-    createObjectClient: grip => ObjectClient(grip),
+    createObjectFront: grip => ObjectFront(grip),
     mode: MODE.LONG,
     ...overrides,
   };
 }
 const LongStringClientMock = require("../__mocks__/long-string-client");
 
 function mount(props, { initialState } = {}) {
   const client = {
-    createObjectClient: grip =>
-      ObjectClient(grip, {
+    createObjectFront: grip =>
+      ObjectFront(grip, {
         getPrototype: () => Promise.resolve(protoStub),
         getProxySlots: () =>
           Promise.resolve(gripRepStubs.get("testProxySlots")),
       }),
 
     createLongStringClient: grip =>
       LongStringClientMock(grip, {
         substring: function(initiaLength, length, cb) {
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/function.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/function.js
@@ -2,27 +2,27 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 const { mountObjectInspector } = require("../test-utils");
 const { MODE } = require("../../../reps/constants");
 const { createNode } = require("../../utils/node");
 
 const functionStubs = require("../../../reps/stubs/function");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 
 function generateDefaults(overrides) {
   return {
     autoExpandDepth: 1,
     ...overrides,
   };
 }
 
 function mount(props) {
-  const client = { createObjectClient: grip => ObjectClient(grip) };
+  const client = { createObjectFront: grip => ObjectFront(grip) };
 
   return mountObjectInspector({
     client,
     props: generateDefaults(props),
   });
 }
 
 describe("ObjectInspector - functions", () => {
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/getter-setter.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/getter-setter.js
@@ -6,29 +6,29 @@ const { MODE } = require("../../../reps/
 const {
   formatObjectInspector,
   waitForLoadedProperties,
   mountObjectInspector,
 } = require("../test-utils");
 
 const { makeNodesForProperties } = require("../../utils/node");
 const accessorStubs = require("../../../reps/stubs/accessor");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 
 function generateDefaults(overrides) {
   return {
     autoExpandDepth: 1,
-    createObjectClient: grip => ObjectClient(grip),
+    createObjectFront: grip => ObjectFront(grip),
     mode: MODE.LONG,
     ...overrides,
   };
 }
 
 function mount(stub, propsOverride = {}) {
-  const client = { createObjectClient: grip => ObjectClient(grip) };
+  const client = { createObjectFront: grip => ObjectFront(grip) };
 
   const root = { path: "root", name: "root" };
   const nodes = makeNodesForProperties(
     {
       ownProperties: {
         x: stub,
       },
     },
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/keyboard-navigation.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/keyboard-navigation.js
@@ -2,29 +2,29 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 const { mountObjectInspector } = require("../test-utils");
 const repsPath = "../../../reps";
 const { MODE } = require(`${repsPath}/constants`);
 
 const { formatObjectInspector, waitForDispatch } = require("../test-utils");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 const gripRepStubs = require(`${repsPath}/stubs/grip`);
 
 function generateDefaults(overrides) {
   return {
     autoExpandDepth: 0,
     mode: MODE.LONG,
     ...overrides,
   };
 }
 
 function mount(props) {
-  const client = { createObjectClient: grip => ObjectClient(grip) };
+  const client = { createObjectFront: grip => ObjectFront(grip) };
 
   return mountObjectInspector({
     client,
     props: generateDefaults(props),
   });
 }
 
 describe("ObjectInspector - keyboard navigation", () => {
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/properties.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/properties.js
@@ -1,41 +1,41 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 /* global jest */
 
 const { mountObjectInspector } = require("../test-utils");
 const gripRepStubs = require("../../../reps/stubs/grip");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 
 const { formatObjectInspector } = require("../test-utils");
 
 function generateDefaults(overrides) {
   return {
     autoExpandDepth: 0,
-    createObjectClient: grip => ObjectClient(grip),
+    createObjectFront: grip => ObjectFront(grip),
     ...overrides,
   };
 }
 
 function getEnumPropertiesMock() {
   return jest.fn(() => ({
     iterator: {
       slice: () => ({}),
     },
   }));
 }
 
 function mount(props, { initialState } = {}) {
   const enumProperties = getEnumPropertiesMock();
 
   const client = {
-    createObjectClient: grip => ObjectClient(grip, { enumProperties }),
+    createObjectFront: grip => ObjectFront(grip, { enumProperties }),
   };
 
   const obj = mountObjectInspector({
     client,
     props: generateDefaults(props),
     initialState,
   });
 
@@ -78,17 +78,17 @@ describe("ObjectInspector - properties",
       roots: [
         {
           path: "root",
           contents: {
             value: stub,
           },
         },
       ],
-      createObjectClient: grip => ObjectClient(grip, { enumProperties }),
+      createObjectFront: grip => ObjectFront(grip, { enumProperties }),
     });
 
     const node = wrapper.find(".node");
     node.simulate("click");
 
     // The function is called twice, to get both non-indexed and indexed props.
     expect(enumProperties.mock.calls).toHaveLength(2);
     expect(enumProperties.mock.calls[0][0]).toEqual({
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/proxy.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/proxy.js
@@ -6,17 +6,17 @@
 const { mountObjectInspector } = require("../test-utils");
 
 const { MODE } = require("../../../reps/constants");
 const gripStubs = require("../../../reps/stubs/grip");
 const stub = gripStubs.get("testProxy");
 const proxySlots = gripStubs.get("testProxySlots");
 const { formatObjectInspector } = require("../test-utils");
 
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 function generateDefaults(overrides) {
   return {
     roots: [
       {
         path: "root",
         contents: { value: stub },
       },
     ],
@@ -38,18 +38,18 @@ function getProxySlotsMock() {
   return jest.fn(() => proxySlots);
 }
 
 function mount(props, { initialState } = {}) {
   const enumProperties = getEnumPropertiesMock();
   const getProxySlots = getProxySlotsMock();
 
   const client = {
-    createObjectClient: grip =>
-      ObjectClient(grip, { enumProperties, getProxySlots }),
+    createObjectFront: grip =>
+      ObjectFront(grip, { enumProperties, getProxySlots }),
   };
 
   const obj = mountObjectInspector({
     client,
     props: generateDefaults(props),
     initialState,
   });
 
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/release-actors.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/release-actors.js
@@ -2,17 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 /* global jest */
 const { mountObjectInspector } = require("../test-utils");
 
 const repsPath = "../../../reps";
 const gripRepStubs = require(`${repsPath}/stubs/grip`);
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 const stub = gripRepStubs.get("testMoreThanMaxProps");
 const { waitForDispatch } = require("../test-utils");
 
 function getEnumPropertiesMock() {
   return jest.fn(() => ({
     iterator: {
       slice: () => ({}),
     },
@@ -33,17 +33,17 @@ function generateDefaults(overrides) {
     ...overrides,
   };
 }
 
 function mount(props, { initialState } = {}) {
   const enumProperties = getEnumPropertiesMock();
 
   const client = {
-    createObjectClient: grip => ObjectClient(grip, { enumProperties }),
+    createObjectFront: grip => ObjectFront(grip, { enumProperties }),
     releaseActor: jest.fn(),
   };
 
   return mountObjectInspector({
     client,
     props: generateDefaults(props),
     initialState: {
       objectInspector: {
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/should-item-update.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/should-item-update.js
@@ -1,33 +1,33 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 /* global jest */
 
 const { mountObjectInspector } = require("../test-utils");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 const LongStringClient = require("../__mocks__/long-string-client");
 
 const repsPath = "../../../reps";
 const longStringStubs = require(`${repsPath}/stubs/long-string`);
 const gripStubs = require(`${repsPath}/stubs/grip`);
 
 function mount(stub) {
   const root = {
     path: "root",
     contents: {
       value: stub,
     },
   };
 
   const { wrapper } = mountObjectInspector({
     client: {
-      createObjectClient: grip => ObjectClient(grip),
+      createObjectFront: grip => ObjectFront(grip),
       createLongStringClient: grip => LongStringClient(grip),
     },
     props: {
       roots: [root],
     },
   });
 
   return { wrapper, root };
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/window.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/tests/component/window.js
@@ -1,23 +1,23 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 const { createNode } = require("../../utils/node");
 const { waitForDispatch, mountObjectInspector } = require("../test-utils");
 
 const gripWindowStubs = require("../../../reps/stubs/window");
-const ObjectClient = require("../__mocks__/object-client");
+const ObjectFront = require("../__mocks__/object-front");
 const windowNode = createNode({
   name: "window",
   contents: { value: gripWindowStubs.get("Window") },
 });
 
-const client = { createObjectClient: grip => ObjectClient(grip) };
+const client = { createObjectFront: grip => ObjectFront(grip) };
 
 function generateDefaults(overrides) {
   return {
     autoExpandDepth: 0,
     roots: [windowNode],
     ...overrides,
   };
 }
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/types.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/types.js
@@ -64,17 +64,17 @@ export type RdpGrip = {
   type: string,
 };
 
 export type PropertiesIterator = {
   count: number,
   slice: (start: number, count: number) => Promise<GripProperties>,
 };
 
-export type ObjectClient = {
+export type ObjectFront = {
   enumEntries: () => Promise<PropertiesIterator>,
   enumProperties: (options: Object) => Promise<PropertiesIterator>,
   enumSymbols: () => Promise<PropertiesIterator>,
   getPrototype: () => Promise<{ prototype: Object }>,
   getProxySlots: () => Promise<{ proxyTarget: Object, proxyHandler: Object }>,
 };
 
 export type LongStringClient = {
@@ -84,17 +84,17 @@ export type LongStringClient = {
     response: {
       substring?: string,
       error?: Error,
       message?: string,
     }
   ) => void,
 };
 
-export type CreateObjectClient = RdpGrip => ObjectClient;
+export type CreateObjectFront = RdpGrip => ObjectFront;
 
 export type CreateLongStringClient = RdpGrip => LongStringClient;
 
 export type CachedNodes = Map<Path, Array<Node>>;
 
 export type LoadedProperties = Map<Path, GripProperties>;
 
 export type Evaluations = Map<
@@ -112,17 +112,17 @@ export type Props = {
   focusable: boolean,
   itemHeight: number,
   inline: boolean,
   mode: Mode,
   roots: Array<Node>,
   disableWrap: boolean,
   dimTopLevelWindow: boolean,
   releaseActor: string => void,
-  createObjectClient: CreateObjectClient,
+  createObjectFront: CreateObjectFront,
   createLongStringClient: CreateLongStringClient,
   onFocus: ?(Node) => any,
   onActivate: ?(Node) => any,
   onDoubleClick: ?(
     item: Node,
     options: {
       depth: number,
       focused: boolean,
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/utils/client.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/utils/client.js
@@ -1,95 +1,95 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 // @flow
 import type {
   GripProperties,
-  ObjectClient,
+  ObjectFront,
   PropertiesIterator,
   Node,
   LongStringClient,
 } from "../types";
 
 const { getValue, nodeHasFullText } = require("../utils/node");
 
 async function enumIndexedProperties(
-  objectClient: ObjectClient,
+  objectFront: ObjectFront,
   start: ?number,
   end: ?number
 ): Promise<{ ownProperties?: Object }> {
   try {
-    const { iterator } = await objectClient.enumProperties({
+    const iterator = await objectFront.enumProperties({
       ignoreNonIndexedProperties: true,
     });
     const response = await iteratorSlice(iterator, start, end);
     return response;
   } catch (e) {
     console.error("Error in enumIndexedProperties", e);
     return {};
   }
 }
 
 async function enumNonIndexedProperties(
-  objectClient: ObjectClient,
+  objectFront: ObjectFront,
   start: ?number,
   end: ?number
 ): Promise<{ ownProperties?: Object }> {
   try {
-    const { iterator } = await objectClient.enumProperties({
+    const iterator = await objectFront.enumProperties({
       ignoreIndexedProperties: true,
     });
     const response = await iteratorSlice(iterator, start, end);
     return response;
   } catch (e) {
     console.error("Error in enumNonIndexedProperties", e);
     return {};
   }
 }
 
 async function enumEntries(
-  objectClient: ObjectClient,
+  objectFront: ObjectFront,
   start: ?number,
   end: ?number
 ): Promise<{ ownProperties?: Object }> {
   try {
-    const { iterator } = await objectClient.enumEntries();
+    const iterator = await objectFront.enumEntries();
     const response = await iteratorSlice(iterator, start, end);
     return response;
   } catch (e) {
     console.error("Error in enumEntries", e);
     return {};
   }
 }
 
 async function enumSymbols(
-  objectClient: ObjectClient,
+  objectFront: ObjectFront,
   start: ?number,
   end: ?number
 ): Promise<{ ownSymbols?: Array<Object> }> {
   try {
-    const { iterator } = await objectClient.enumSymbols();
+    const iterator = await objectFront.enumSymbols();
     const response = await iteratorSlice(iterator, start, end);
     return response;
   } catch (e) {
     console.error("Error in enumSymbols", e);
     return {};
   }
 }
 
 async function getPrototype(
-  objectClient: ObjectClient
+  objectFront: ObjectFront
 ): ?Promise<{ prototype?: Object }> {
-  if (typeof objectClient.getPrototype !== "function") {
-    console.error("objectClient.getPrototype is not a function");
+  if (typeof objectFront.getPrototype !== "function") {
+    console.error("objectFront.getPrototype is not a function");
     return Promise.resolve({});
   }
-  return objectClient.getPrototype();
+  return objectFront.getPrototype();
 }
 
 async function getFullText(
   longStringClient: LongStringClient,
   item: Node
 ): Promise<{ fullText?: string }> {
   const { initial, fullText, length } = getValue(item);
 
@@ -113,19 +113,19 @@ async function getFullText(
       resolve({
         fullText: initial + response.substring,
       });
     });
   });
 }
 
 async function getProxySlots(
-  objectClient: ObjectClient
+  objectFront: ObjectFront
 ): Promise<{ proxyTarget?: Object, proxyHandler?: Object }> {
-  return objectClient.getProxySlots();
+  return objectFront.getProxySlots();
 }
 
 function iteratorSlice(
   iterator: PropertiesIterator,
   start: ?number,
   end: ?number
 ): Promise<GripProperties> {
   start = start || 0;
--- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/utils/load-properties.js
+++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/utils/load-properties.js
@@ -26,70 +26,80 @@ const {
   nodeIsPrimitive,
   nodeIsProxy,
   nodeNeedsNumericalBuckets,
   nodeIsLongString,
 } = require("./node");
 
 import type {
   CreateLongStringClient,
-  CreateObjectClient,
+  CreateObjectFront,
   GripProperties,
   LoadedProperties,
   Node,
 } from "../types";
 
 type Client = {
-  createObjectClient: CreateObjectClient,
+  createObjectFront: CreateObjectFront,
   createLongStringClient: CreateLongStringClient,
 };
 
 function loadItemProperties(
   item: Node,
   client: Client,
   loadedProperties: LoadedProperties
 ): Promise<GripProperties> {
   const gripItem = getClosestGripNode(item);
   const value = getValue(gripItem);
 
   const [start, end] = item.meta
     ? [item.meta.startIndex, item.meta.endIndex]
     : [];
 
   const promises = [];
-  let objectClient;
-  const getObjectClient = () =>
-    objectClient || client.createObjectClient(value);
+  let objectFront;
+
+  if (value && client && client.getFrontByID) {
+    objectFront = client.getFrontByID(value.actor);
+  }
+
+  const getObjectFront = function() {
+    if (!objectFront) {
+      objectFront = client.createObjectFront(value);
+    }
+
+    return objectFront;
+  };
 
   if (shouldLoadItemIndexedProperties(item, loadedProperties)) {
-    promises.push(enumIndexedProperties(getObjectClient(), start, end));
+    promises.push(enumIndexedProperties(getObjectFront(), start, end));
   }
 
   if (shouldLoadItemNonIndexedProperties(item, loadedProperties)) {
-    promises.push(enumNonIndexedProperties(getObjectClient(), start, end));
+    promises.push(enumNonIndexedProperties(getObjectFront(), start, end));
   }
 
   if (shouldLoadItemEntries(item, loadedProperties)) {
-    promises.push(enumEntries(getObjectClient(), start, end));
+    promises.push(enumEntries(getObjectFront(), start, end));
   }
 
   if (shouldLoadItemPrototype(item, loadedProperties)) {
-    promises.push(getPrototype(getObjectClient()));
+    promises.push(getPrototype(getObjectFront()));
   }
 
   if (shouldLoadItemSymbols(item, loadedProperties)) {
-    promises.push(enumSymbols(getObjectClient(), start, end));
+    promises.push(enumSymbols(getObjectFront(), start, end));
   }
 
   if (shouldLoadItemFullText(item, loadedProperties)) {
     promises.push(getFullText(client.createLongStringClient(value), item));
   }
 
   if (shouldLoadItemProxySlots(item, loadedProperties)) {
-    promises.push(getProxySlots(getObjectClient()));
+    promises.push(getProxySlots(getObjectFront()));
   }
 
   return Promise.all(promises).then(mergeResponses);
 }
 
 function mergeResponses(responses: Array<Object>): Object {
   const data = {};
 
--- a/devtools/client/debugger/src/client/firefox.js
+++ b/devtools/client/debugger/src/client/firefox.js
@@ -5,18 +5,18 @@
 // @flow
 
 import { setupCommands, clientCommands } from "./firefox/commands";
 import { setupEvents, clientEvents } from "./firefox/events";
 import { features, prefs } from "../utils/prefs";
 import type { Grip } from "../types";
 let DebuggerClient;
 
-function createObjectClient(grip: Grip) {
-  return DebuggerClient.createObjectClient(grip);
+function createObjectFront(grip: Grip) {
+  return DebuggerClient.createObjectFront(grip);
 }
 
 export async function onConnect(connection: any, actions: Object) {
   const {
     tabConnection: { tabTarget, threadFront, debuggerClient },
   } = connection;
 
   DebuggerClient = debuggerClient;
@@ -71,9 +71,9 @@ export async function onConnect(connecti
   // bfcache) so explicity fire `newSource` events for all returned
   // sources.
   const sources = await clientCommands.fetchSources();
   await actions.newGeneratedSources(sources);
 
   await clientCommands.checkIfAlreadyPaused();
 }
 
-export { createObjectClient, clientCommands, clientEvents };
+export { createObjectFront, clientCommands, clientEvents };
--- a/devtools/client/debugger/src/client/firefox/commands.js
+++ b/devtools/client/debugger/src/client/firefox/commands.js
@@ -27,17 +27,17 @@ import type {
   ThreadType,
 } from "../../types";
 
 import type {
   Target,
   DebuggerClient,
   Grip,
   ThreadFront,
-  ObjectClient,
+  ObjectFront,
   SourcesPacket,
 } from "./types";
 
 import type {
   EventListenerCategoryList,
   EventListenerActiveList,
 } from "../../actions/types";
 
@@ -59,18 +59,18 @@ function setupCommands(dependencies: Dep
   currentThreadFront = dependencies.threadFront;
   currentTarget = dependencies.tabTarget;
   debuggerClient = dependencies.debuggerClient;
   targets = { worker: {}, contentProcess: {} };
   sourceActors = {};
   breakpoints = {};
 }
 
-function createObjectClient(grip: Grip) {
-  return debuggerClient.createObjectClient(grip);
+function createObjectFront(grip: Grip) {
+  return debuggerClient.createObjectFront(grip);
 }
 
 async function loadObjectProperties(root: Node) {
   const utils = Reps.objectInspector.utils;
   const properties = await utils.loadProperties.loadItemProperties(
     root,
     debuggerClient
   );
@@ -188,25 +188,25 @@ function removeXHRBreakpoint(path: strin
 
 function addWatchpoint(
   object: Grip,
   property: string,
   label: string,
   watchpointType: string
 ) {
   if (currentTarget.traits.watchpoints) {
-    const objectClient = createObjectClient(object);
-    return objectClient.addWatchpoint(property, label, watchpointType);
+    const objectFront = createObjectFront(object);
+    return objectFront.addWatchpoint(property, label, watchpointType);
   }
 }
 
 function removeWatchpoint(object: Grip, property: string) {
   if (currentTarget.traits.watchpoints) {
-    const objectClient = createObjectClient(object);
-    return objectClient.removeWatchpoint(property);
+    const objectFront = createObjectFront(object);
+    return objectFront.removeWatchpoint(property);
   }
 }
 
 // Get the string key to use for a breakpoint location.
 // See also duplicate code in breakpoint-actor-map.js :(
 function locationKey(location: BreakpointLocation) {
   const { sourceUrl, line, column } = location;
   const sourceId = location.sourceId || "";
@@ -396,17 +396,17 @@ async function getEventListenerBreakpoin
       categories = null;
     }
   } catch (err) {
     // Event bps aren't supported on this firefox version.
   }
   return categories || [];
 }
 
-function pauseGrip(thread: string, func: Function): ObjectClient {
+function pauseGrip(thread: string, func: Function): ObjectFront {
   return lookupThreadFront(thread).pauseGrip(func);
 }
 
 function registerSourceActor(sourceActorId: string, sourceId: SourceId) {
   sourceActors[sourceActorId] = sourceId;
 }
 
 async function getSources(
@@ -543,17 +543,17 @@ async function getSourceActorBreakableLi
 
 function getFrontByID(actorID: String) {
   return debuggerClient.getFrontByID(actorID);
 }
 
 const clientCommands = {
   autocomplete,
   blackBox,
-  createObjectClient,
+  createObjectFront,
   loadObjectProperties,
   releaseActor,
   interrupt,
   pauseGrip,
   resume,
   stepIn,
   stepOut,
   stepOver,
--- a/devtools/client/debugger/src/client/firefox/types.js
+++ b/devtools/client/debugger/src/client/firefox/types.js
@@ -255,17 +255,17 @@ export type DebuggerClient = {
     traits: any,
     getFront: string => Promise<*>,
     listProcesses: () => Promise<{ processes: ProcessDescriptor }>,
     on: (string, Function) => void,
   },
   connect: () => Promise<*>,
   request: (packet: Object) => Promise<*>,
   attachConsole: (actor: String, listeners: Array<*>) => Promise<*>,
-  createObjectClient: (grip: Grip) => ObjectClient,
+  createObjectFront: (grip: Grip) => ObjectFront,
   release: (actor: String) => {},
   getFrontByID: (actor: String) => { release: () => Promise<*> },
 };
 
 type ProcessDescriptor = Object;
 
 /**
  * A grip is a JSON value that refers to a specific JavaScript value in the
@@ -328,21 +328,21 @@ export type SourceClient = {
   prettyPrint: number => Promise<*>,
   disablePrettyPrint: () => Promise<*>,
   blackBox: (range?: Range) => Promise<*>,
   unblackBox: (range?: Range) => Promise<*>,
   getBreakableLines: () => Promise<number[]>,
 };
 
 /**
- * ObjectClient
+ * ObjectFront
  * @memberof firefox
  * @static
  */
-export type ObjectClient = {
+export type ObjectFront = {
   getPrototypeAndProperties: () => any,
   addWatchpoint: (
     property: string,
     label: string,
     watchpointType: string
   ) => {},
   removeWatchpoint: (property: string) => {},
 };
@@ -357,17 +357,17 @@ export type ThreadFront = {
   stepIn: Function => Promise<*>,
   stepOver: Function => Promise<*>,
   stepOut: Function => Promise<*>,
   rewind: Function => Promise<*>,
   reverseStepOver: Function => Promise<*>,
   breakOnNext: () => Promise<*>,
   // FIXME: unclear if SourceId or ActorId here
   source: ({ actor: SourceId }) => SourceClient,
-  pauseGrip: (Grip | Function) => ObjectClient,
+  pauseGrip: (Grip | Function) => ObjectFront,
   pauseOnExceptions: (boolean, boolean) => Promise<*>,
   setBreakpoint: (BreakpointLocation, BreakpointOptions) => Promise<*>,
   removeBreakpoint: PendingLocation => Promise<*>,
   setXHRBreakpoint: (path: string, method: string) => Promise<boolean>,
   removeXHRBreakpoint: (path: string, method: string) => Promise<boolean>,
   interrupt: () => Promise<*>,
   eventListeners: () => Promise<*>,
   getFrames: (number, number) => FramesResponse,
--- a/devtools/client/debugger/src/components/Editor/Preview/Popup.js
+++ b/devtools/client/debugger/src/components/Editor/Preview/Popup.js
@@ -20,17 +20,17 @@ const {
   node: { nodeIsPrimitive, nodeIsFunction, nodeIsObject },
 } = utils;
 
 import actions from "../../../actions";
 import { getThreadContext } from "../../../selectors";
 import Popover from "../../shared/Popover";
 import PreviewFunction from "../../shared/PreviewFunction";
 
-import { createObjectClient } from "../../../client/firefox";
+import { createObjectFront } from "../../../client/firefox";
 
 import "./Popup.css";
 
 import type { ThreadContext } from "../../../types";
 import type { Preview } from "../../../reducers/types";
 
 type OwnProps = {|
   editor: any,
@@ -135,17 +135,17 @@ export class Popup extends Component<Pro
         style={{ maxHeight: this.calculateMaxHeight() }}
       >
         <ObjectInspector
           roots={properties}
           autoExpandDepth={0}
           disableWrap={true}
           focusable={false}
           openLink={openLink}
-          createObjectClient={grip => createObjectClient(grip)}
+          createObjectFront={grip => createObjectFront(grip)}
           onDOMNodeClick={grip => openElementInInspector(grip)}
           onInspectIconClick={grip => openElementInInspector(grip)}
           onDOMNodeMouseOver={grip => highlightDomElement(grip)}
           onDOMNodeMouseOut={grip => unHighlightDomElement(grip)}
         />
       </div>
     );
   }
--- a/devtools/client/debugger/src/components/SecondaryPanes/Expressions.js
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Expressions.js
@@ -14,17 +14,17 @@ import { objectInspector } from "devtool
 import actions from "../../actions";
 import {
   getExpressions,
   getExpressionError,
   getAutocompleteMatchset,
   getThreadContext,
 } from "../../selectors";
 import { getValue } from "../../utils/expressions";
-import { createObjectClient } from "../../client/firefox";
+import { createObjectFront } from "../../client/firefox";
 
 import { CloseButton } from "../shared/Button";
 import { debounce } from "lodash";
 
 import type { List } from "immutable";
 import type { Expression, ThreadContext } from "../../types";
 
 import "./Expressions.css";
@@ -269,17 +269,17 @@ class Expressions extends Component<Prop
         }
       >
         <div className="expression-content">
           <ObjectInspector
             roots={[root]}
             autoExpandDepth={0}
             disableWrap={true}
             openLink={openLink}
-            createObjectClient={grip => createObjectClient(grip)}
+            createObjectFront={grip => createObjectFront(grip)}
             onDOMNodeClick={grip => openElementInInspector(grip)}
             onInspectIconClick={grip => openElementInInspector(grip)}
             onDOMNodeMouseOver={grip => highlightDomElement(grip)}
             onDOMNodeMouseOut={grip => unHighlightDomElement(grip)}
           />
           <div className="expression-container__close-btn">
             <CloseButton
               handleClick={e => this.deleteExpression(e, expression)}
--- a/devtools/client/debugger/src/components/SecondaryPanes/Scopes.js
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Scopes.js
@@ -2,17 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 // @flow
 import React, { PureComponent } from "react";
 import { showMenu } from "devtools-contextmenu";
 import { connect } from "../../utils/connect";
 import actions from "../../actions";
-import { createObjectClient } from "../../client/firefox";
+import { createObjectFront } from "../../client/firefox";
 import { features } from "../../utils/prefs";
 
 import {
   getSelectedSource,
   getSelectedFrame,
   getGeneratedFrameScope,
   getOriginalFrameScope,
   getPauseReason,
@@ -193,17 +193,17 @@ class Scopes extends PureComponent<Props
         <div className="pane scopes-list">
           <ObjectInspector
             roots={scopes}
             autoExpandAll={false}
             autoExpandDepth={1}
             disableWrap={true}
             dimTopLevelWindow={true}
             openLink={openLink}
-            createObjectClient={grip => createObjectClient(grip)}
+            createObjectFront={grip => createObjectFront(grip)}
             onDOMNodeClick={grip => openElementInInspector(grip)}
             onInspectIconClick={grip => openElementInInspector(grip)}
             onDOMNodeMouseOver={grip => highlightDomElement(grip)}
             onDOMNodeMouseOut={grip => unHighlightDomElement(grip)}
             onContextMenu={this.onContextMenu}
             setExpanded={(path, expand) => setExpandedScope(cx, path, expand)}
             initiallyExpanded={initiallyExpanded}
           />
--- a/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap
+++ b/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap
@@ -10,17 +10,17 @@ exports[`Expressions should always have 
     onDoubleClick={[Function]}
     title="expression1"
   >
     <div
       className="expression-content"
     >
       <Component
         autoExpandDepth={0}
-        createObjectClient={[Function]}
+        createObjectFront={[Function]}
         disableWrap={true}
         onDOMNodeClick={[Function]}
         onDOMNodeMouseOut={[Function]}
         onDOMNodeMouseOver={[Function]}
         onInspectIconClick={[Function]}
         roots={
           Array [
             Object {
@@ -52,17 +52,17 @@ exports[`Expressions should always have 
     onDoubleClick={[Function]}
     title="expression2"
   >
     <div
       className="expression-content"
     >
       <Component
         autoExpandDepth={0}
-        createObjectClient={[Function]}
+        createObjectFront={[Function]}
         disableWrap={true}
         onDOMNodeClick={[Function]}
         onDOMNodeMouseOut={[Function]}
         onDOMNodeMouseOver={[Function]}
         onInspectIconClick={[Function]}
         roots={
           Array [
             Object {
@@ -101,17 +101,17 @@ exports[`Expressions should render 1`] =
     onDoubleClick={[Function]}
     title="expression1"
   >
     <div
       className="expression-content"
     >
       <Component
         autoExpandDepth={0}
-        createObjectClient={[Function]}
+        createObjectFront={[Function]}
         disableWrap={true}
         onDOMNodeClick={[Function]}
         onDOMNodeMouseOut={[Function]}
         onDOMNodeMouseOver={[Function]}
         onInspectIconClick={[Function]}
         roots={
           Array [
             Object {
@@ -143,17 +143,17 @@ exports[`Expressions should render 1`] =
     onDoubleClick={[Function]}
     title="expression2"
   >
     <div
       className="expression-content"
     >
       <Component
         autoExpandDepth={0}
-        createObjectClient={[Function]}
+        createObjectFront={[Function]}
         disableWrap={true}
         onDOMNodeClick={[Function]}
         onDOMNodeMouseOut={[Function]}
         onDOMNodeMouseOver={[Function]}
         onInspectIconClick={[Function]}
         roots={
           Array [
             Object {
--- a/devtools/client/debugger/src/utils/pause/mapScopes/buildGeneratedBindingList.js
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/buildGeneratedBindingList.js
@@ -2,17 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 // @flow
 
 import { has } from "lodash";
 import type { SourceScope, BindingLocation } from "../../../workers/parser";
 import type { Scope, BindingContents } from "../../../types";
-import { createObjectClient } from "../../../client/firefox";
+import { createObjectFront } from "../../../client/firefox";
 
 import { locColumn } from "./locColumn";
 
 export type GeneratedBindingLocation = {
   name: string,
   loc: BindingLocation,
   desc: () => Promise<BindingContents | null>,
 };
@@ -97,18 +97,18 @@ export function buildGeneratedBindingLis
           const globalGrip = globalScope && globalScope.object;
           if (globalGrip) {
             // Should always exist, just checking to keep Flow happy.
 
             generatedBindings.push({
               name,
               loc,
               desc: async () => {
-                const objectClient = createObjectClient(globalGrip);
-                return (await objectClient.getProperty(name)).descriptor;
+                const objectFront = createObjectFront(globalGrip);
+                return (await objectFront.getProperty(name)).descriptor;
               },
             });
           }
         }
       }
     }
   }
 
--- a/devtools/client/debugger/src/utils/pause/mapScopes/findGeneratedBindingFromPosition.js
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/findGeneratedBindingFromPosition.js
@@ -6,17 +6,17 @@
 
 import { locColumn } from "./locColumn";
 import { mappingContains } from "./mappingContains";
 
 import type { BindingContents } from "../../../types";
 // eslint-disable-next-line max-len
 import type { ApplicableBinding } from "./getApplicableBindingsForOriginalPosition";
 
-import { createObjectClient } from "../../../client/firefox";
+import { createObjectFront } from "../../../client/firefox";
 
 export type GeneratedDescriptor = {
   name: string,
   // Falsy if the binding itself matched a location, but the location didn't
   // have a value descriptor attached. Happens if the binding was 'this'
   // or if there was a mismatch between client and generated scopes.
   desc: ?BindingContents,
 
@@ -319,11 +319,11 @@ async function readDescriptorProperty(
   }
 
   if (!isObjectValue(desc)) {
     // If we got a non-primitive descriptor but it isn't an object, then
     // it's definitely not the namespace and it is probably an error.
     return desc;
   }
 
-  const objectClient = createObjectClient(desc.value);
-  return (await objectClient.getProperty(property)).descriptor;
+  const objectFront = createObjectFront(desc.value);
+  return (await objectFront.getProperty(property)).descriptor;
 }
--- a/devtools/client/dom/panel.js
+++ b/devtools/client/dom/panel.js
@@ -1,15 +1,15 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
 const { Cu } = require("chrome");
-const ObjectClient = require("devtools/shared/client/object-client");
+const ObjectFront = require("devtools/shared/fronts/object");
 
 const EventEmitter = require("devtools/shared/event-emitter");
 loader.lazyRequireGetter(
   this,
   "openContentLink",
   "devtools/client/shared/link",
   true
 );
@@ -156,18 +156,18 @@ DomPanel.prototype = {
       return null;
     }
 
     // Check for a previously stored request for grip.
     let request = this.pendingRequests.get(grip.actor);
 
     // If no request is in progress create a new one.
     if (!request) {
-      const client = new ObjectClient(this.target.client, grip);
-      request = client.getPrototypeAndProperties();
+      const objectFront = new ObjectFront(this.target.client, grip);
+      request = objectFront.getPrototypeAndProperties();
       this.pendingRequests.set(grip.actor, request);
     }
 
     const response = await request;
     this.pendingRequests.delete(grip.actor);
 
     // Fire an event about not having any pending requests.
     if (!this.pendingRequests.size) {
--- a/devtools/client/inspector/extensions/types.js
+++ b/devtools/client/inspector/extensions/types.js
@@ -4,14 +4,14 @@
 
 "use strict";
 
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 
 // Helpers injected as props by extension-sidebar.js and used by the
 // ObjectInspector component (which is part of the ObjectValueGripView).
 exports.serviceContainer = {
-  createObjectClient: PropTypes.func.isRequired,
+  createObjectFront: PropTypes.func.isRequired,
   releaseActor: PropTypes.func.isRequired,
   highlightDomElement: PropTypes.func.isRequired,
   unHighlightDomElement: PropTypes.func.isRequired,
   openNodeInInspector: PropTypes.func.isRequired,
 };
--- a/devtools/client/inspector/inspector.js
+++ b/devtools/client/inspector/inspector.js
@@ -61,21 +61,17 @@ loader.lazyRequireGetter(
   "ExtensionSidebar",
   "devtools/client/inspector/extensions/extension-sidebar"
 );
 loader.lazyRequireGetter(
   this,
   "saveScreenshot",
   "devtools/shared/screenshot/save"
 );
-loader.lazyRequireGetter(
-  this,
-  "ObjectClient",
-  "devtools/shared/client/object-client"
-);
+loader.lazyRequireGetter(this, "ObjectFront", "devtools/shared/fronts/object");
 
 loader.lazyImporter(
   this,
   "DeferredTask",
   "resource://gre/modules/DeferredTask.jsm"
 );
 
 const { LocalizationHelper, localizeMarkup } = require("devtools/shared/l10n");
@@ -146,18 +142,18 @@ function Inspector(toolbox) {
 
   this._toolbox = toolbox;
   this._target = toolbox.target;
   this.panelDoc = window.document;
   this.panelWin = window;
   this.panelWin.inspector = this;
   this.telemetry = toolbox.telemetry;
   this.store = Store({
-    createObjectClient: object => {
-      return new ObjectClient(toolbox.target.client, object);
+    createObjectFront: object => {
+      return new ObjectFront(toolbox.target.client, object);
     },
     releaseActor: actor => {
       if (!actor) {
         return;
       }
       const objFront = toolbox.target.client.getFrontByID(actor);
       if (objFront) {
         objFront.release();
--- a/devtools/client/inspector/store.js
+++ b/devtools/client/inspector/store.js
@@ -9,14 +9,14 @@ const reducers = require("devtools/clien
 
 module.exports = services =>
   createStore(reducers, {
     // Enable log middleware in tests
     shouldLog: true,
     thunkOptions: {
       // Needed for the ObjectInspector
       client: {
-        createObjectClient: services && services.createObjectClient,
+        createObjectFront: services && services.createObjectFront,
         createLongStringClient: services && services.createLongStringClient,
         releaseActor: services && services.releaseActor,
       },
     },
   });
--- a/devtools/client/scratchpad/scratchpad.js
+++ b/devtools/client/scratchpad/scratchpad.js
@@ -119,21 +119,17 @@ loader.lazyRequireGetter(
   "devtools/shared/client/debugger-client",
   true
 );
 loader.lazyRequireGetter(
   this,
   "EnvironmentFront",
   "devtools/shared/fronts/environment"
 );
-loader.lazyRequireGetter(
-  this,
-  "ObjectClient",
-  "devtools/shared/client/object-client"
-);
+loader.lazyRequireGetter(this, "ObjectFront", "devtools/shared/fronts/object");
 loader.lazyRequireGetter(
   this,
   "BrowserConsoleManager",
   "devtools/client/webconsole/browser-console-manager",
   true
 );
 loader.lazyRequireGetter(
   this,
@@ -653,18 +649,18 @@ var Scratchpad = {
     const [string, error, result] = await this.execute();
     if (error) {
       await this.writeAsErrorComment(error);
       return [string, error, result];
     } else if (VariablesView.isPrimitive({ value: result })) {
       await this._writePrimitiveAsComment(result);
       return [string, error, result];
     }
-    const objectClient = new ObjectClient(this.debuggerClient, result);
-    const response = await objectClient.getDisplayString();
+    const objectFront = new ObjectFront(this.debuggerClient, result);
+    const response = await objectFront.getDisplayString();
     if (response.error) {
       reportError("display", response);
       throw new Error(response.error);
     } else {
       this.writeAsComment(response.displayString);
       return [string, error, result];
     }
   },
@@ -924,20 +920,20 @@ var Scratchpad = {
         const stack = this._constructErrorStack(exception.preview);
         if (typeof error.exceptionMessage == "string") {
           resolve(error.exceptionMessage + stack);
         } else {
           resolve(stack);
         }
       } else {
         // If there is no preview information, we need to ask the server for more.
-        const objectClient = new ObjectClient(this.debuggerClient, exception);
+        const objectFront = new ObjectFront(this.debuggerClient, exception);
         let response;
         try {
-          response = await objectClient.getPrototypeAndProperties();
+          response = await objectFront.getPrototypeAndProperties();
         } catch (ex) {
           reject(ex);
         }
         if (response.error) {
           reject(response);
           return;
         }
 
@@ -955,17 +951,17 @@ var Scratchpad = {
 
         const stack = this._constructErrorStack(error);
 
         if (typeof error.message == "string") {
           resolve(error.message + stack);
         } else {
           let response;
           try {
-            response = await objectClient.getDisplayString();
+            response = await objectFront.getDisplayString();
           } catch (ex) {
             reject(ex);
           }
           if (response.error) {
             reject(response);
           } else if (typeof response.displayString == "string") {
             resolve(response.displayString + stack);
           } else {
@@ -2334,18 +2330,18 @@ ScratchpadSidebar.prototype = {
 
           VariablesViewController.attach(this.variablesView, {
             getEnvironmentFront: grip => {
               return new EnvironmentFront(
                 this._scratchpad.debuggerClient,
                 grip
               );
             },
-            getObjectClient: grip => {
-              return new ObjectClient(this._scratchpad.debuggerClient, grip);
+            getObjectFront: grip => {
+              return new ObjectFront(this._scratchpad.debuggerClient, grip);
             },
             getLongStringClient: actor => {
               return this._scratchpad.webConsoleFront.longString(actor);
             },
             releaseActor: actor => {
               const objFront = this._scratchpad.debuggerClient.getFrontByID(
                 actor
               );
--- a/devtools/client/shared/components/reps/reps.js
+++ b/devtools/client/shared/components/reps/reps.js
@@ -2354,17 +2354,17 @@ function getChildren(options) {
 
   return addToCache(makeNodesForProperties(loadedProps, item));
 } // Builds an expression that resolves to the value of the item in question
 // e.g. `b` in { a: { b: 2 } } resolves to `a.b`
 
 
 function getPathExpression(item) {
   if (item && item.parent) {
-    let parent = nodeIsBucket(item.parent) ? item.parent.parent : item.parent;
+    const parent = nodeIsBucket(item.parent) ? item.parent.parent : item.parent;
     return `${getPathExpression(parent)}.${item.name}`;
   }
 
   return item.name;
 }
 
 function getParent(item) {
   return item.parent;
@@ -3952,61 +3952,60 @@ const {
   nodeIsProxy,
   nodeNeedsNumericalBuckets,
   nodeIsLongString
 } = __webpack_require__(114);
 
 function loadItemProperties(item, client, loadedProperties) {
   const gripItem = getClosestGripNode(item);
   const value = getValue(gripItem);
-
   const [start, end] = item.meta ? [item.meta.startIndex, item.meta.endIndex] : [];
   const promises = [];
-  let objectClient;
-  
+  let objectFront;
+
   if (value && client && client.getFrontByID) {
-    objectClient = client.getFrontByID(value.actor);
-  }
-
-  const getObjectClient = function() {
-    if (!objectClient) {
-      objectClient = client.createObjectClient(value);
-    }
-
-    return objectClient;
-  }
+    objectFront = client.getFrontByID(value.actor);
+  }
+
+  const getObjectFront = function () {
+    if (!objectFront) {
+      objectFront = client.createObjectFront(value);
+    }
+
+    return objectFront;
+  };
 
   if (shouldLoadItemIndexedProperties(item, loadedProperties)) {
-    promises.push(enumIndexedProperties(getObjectClient(), start, end));
-  }
-  
+    promises.push(enumIndexedProperties(getObjectFront(), start, end));
+  }
+
   if (shouldLoadItemNonIndexedProperties(item, loadedProperties)) {
-    promises.push(enumNonIndexedProperties(getObjectClient(), start, end));
-  }
-  
+    promises.push(enumNonIndexedProperties(getObjectFront(), start, end));
+  }
+
   if (shouldLoadItemEntries(item, loadedProperties)) {
-    promises.push(enumEntries(getObjectClient(), start, end));
-  }
-  
+    promises.push(enumEntries(getObjectFront(), start, end));
+  }
+
   if (shouldLoadItemPrototype(item, loadedProperties)) {
-    promises.push(getPrototype(getObjectClient()));
-  }
-  
+    promises.push(getPrototype(getObjectFront()));
+  }
+
   if (shouldLoadItemSymbols(item, loadedProperties)) {
-    promises.push(enumSymbols(getObjectClient(), start, end));
-  }
-  
+    promises.push(enumSymbols(getObjectFront(), start, end));
+  }
+
   if (shouldLoadItemFullText(item, loadedProperties)) {
     promises.push(getFullText(client.createLongStringClient(value), item));
   }
-  
+
   if (shouldLoadItemProxySlots(item, loadedProperties)) {
-    promises.push(getProxySlots(getObjectClient()));
-  }
-  
+    promises.push(getProxySlots(getObjectFront()));
+  }
+
   return Promise.all(promises).then(mergeResponses);
 }
 
 function mergeResponses(responses) {
   const data = {};
 
   for (const response of responses) {
     if (response.hasOwnProperty("ownProperties")) {
@@ -4094,71 +4093,71 @@ module.exports = {
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 const {
   getValue,
   nodeHasFullText
 } = __webpack_require__(114);
 
-async function enumIndexedProperties(objectClient, start, end) {
+async function enumIndexedProperties(objectFront, start, end) {
   try {
-    const iterator = await objectClient.enumProperties({
+    const iterator = await objectFront.enumProperties({
       ignoreNonIndexedProperties: true
     });
     const response = await iteratorSlice(iterator, start, end);
     return response;
   } catch (e) {
     console.error("Error in enumIndexedProperties", e);
     return {};
   }
 }
 
-async function enumNonIndexedProperties(objectClient, start, end) {
+async function enumNonIndexedProperties(objectFront, start, end) {
   try {
-    const iterator = await objectClient.enumProperties({
+    const iterator = await objectFront.enumProperties({
       ignoreIndexedProperties: true
     });
     const response = await iteratorSlice(iterator, start, end);
     return response;
   } catch (e) {
     console.error("Error in enumNonIndexedProperties", e);
     return {};
   }
 }
 
-async function enumEntries(objectClient, start, end) {
+async function enumEntries(objectFront, start, end) {
   try {
-    const iterator = await objectClient.enumEntries();
+    const iterator = await objectFront.enumEntries();
     const response = await iteratorSlice(iterator, start, end);
     return response;
   } catch (e) {
     console.error("Error in enumEntries", e);
     return {};
   }
 }
 
-async function enumSymbols(objectClient, start, end) {
+async function enumSymbols(objectFront, start, end) {
   try {
-    const iterator = await objectClient.enumSymbols();
+    const iterator = await objectFront.enumSymbols();
     const response = await iteratorSlice(iterator, start, end);
     return response;
   } catch (e) {
     console.error("Error in enumSymbols", e);
     return {};
   }
 }
 
-async function getPrototype(objectClient) {
-  if (typeof objectClient.getPrototype !== "function") {
-    console.error("objectClient.getPrototype is not a function");
+async function getPrototype(objectFront) {
+  if (typeof objectFront.getPrototype !== "function") {
+    console.error("objectFront.getPrototype is not a function");
     return Promise.resolve({});
   }
 
-  return objectClient.getPrototype();
+  return objectFront.getPrototype();
 }
 
 async function getFullText(longStringClient, item) {
   const {
     initial,
     fullText,
     length
   } = getValue(item); // Return fullText property if it exists so that it can be added to the
@@ -4180,18 +4179,18 @@ async function getFullText(longStringCli
 
       resolve({
         fullText: initial + response.substring
       });
     });
   });
 }
 
-async function getProxySlots(objectClient) {
-  return objectClient.getProxySlots();
+async function getProxySlots(objectFront) {
+  return objectFront.getProxySlots();
 }
 
 function iteratorSlice(iterator, start, end) {
   start = start || 0;
   const count = end ? end - start + 1 : iterator.count;
 
   if (count === 0) {
     return Promise.resolve({});
@@ -7945,17 +7944,17 @@ function nodeCollapse(node) {
     type: "NODE_COLLAPSE",
     data: {
       node
     }
   };
 }
 /*
  * This action checks if we need to fetch properties, entries, prototype and
- * symbols for a given node. If we do, it will call the appropriate ObjectClient
+ * symbols for a given node. If we do, it will call the appropriate ObjectFront
  * functions.
  */
 
 
 function nodeLoadProperties(node, actor) {
   return async ({
     dispatch,
     client,
@@ -8124,18 +8123,18 @@ async function releaseActors(state, clie
 
 function invokeGetter(node, targetGrip, receiverId, getterName) {
   return async ({
     dispatch,
     client,
     getState
   }) => {
     try {
-      const objectClient = client.createObjectClient(targetGrip);
-      const result = await objectClient.getPropertyValue(getterName, receiverId);
+      const objectFront = client.createObjectFront(targetGrip);
+      const result = await objectFront.getPropertyValue(getterName, receiverId);
       dispatch({
         type: "GETTER_INVOKED",
         data: {
           node,
           result
         }
       });
     } catch (e) {
@@ -8547,9 +8546,9 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBP
 		window.classNames = classNames;
 	}
 }());
 
 
 /***/ })
 
 /******/ });
-});
+});
\ No newline at end of file
--- a/devtools/client/shared/widgets/VariablesViewController.jsm
+++ b/devtools/client/shared/widgets/VariablesViewController.jsm
@@ -32,17 +32,17 @@ var L10N = new LocalizationHelper(DBG_ST
  * Controller for a VariablesView that handles interfacing with the debugger
  * protocol. Is able to populate scopes and variables via the protocol as well
  * as manage actor lifespans.
  *
  * @param VariablesView aView
  *        The view to attach to.
  * @param object aOptions [optional]
  *        Options for configuring the controller. Supported options:
- *        - getObjectClient: @see this._setClientGetters
+ *        - getObjectFront: @see this._setClientGetters
  *        - getLongStringClient: @see this._setClientGetters
  *        - getEnvironmentFront: @see this._setClientGetters
  *        - releaseActor: @see this._setClientGetters
  *        - overrideValueEvalMacro: @see _setEvaluationMacros
  *        - getterOrSetterEvalMacro: @see _setEvaluationMacros
  *        - simpleValueEvalMacro: @see _setEvaluationMacros
  */
 function VariablesViewController(aView, aOptions = {}) {
@@ -73,24 +73,24 @@ VariablesViewController.prototype = {
    */
   _simpleValueEvalMacro: VariablesView.simpleValueEvalMacro,
 
   /**
    * Set the functions used to retrieve debugger client grips.
    *
    * @param object aOptions
    *        Options for getting the client grips. Supported options:
-   *        - getObjectClient: callback for creating an object grip client
+   *        - getObjectFront: callback for creating an object grip front
    *        - getLongStringClient: callback for creating a long string grip client
    *        - getEnvironmentFront: callback for creating an environment front
    *        - releaseActor: callback for releasing an actor when it's no longer needed
    */
   _setClientGetters: function(aOptions) {
-    if (aOptions.getObjectClient) {
-      this._getObjectClient = aOptions.getObjectClient;
+    if (aOptions.getObjectFront) {
+      this._getObjectFront = aOptions.getObjectFront;
     }
     if (aOptions.getLongStringClient) {
       this._getLongStringClient = aOptions.getLongStringClient;
     }
     if (aOptions.getEnvironmentFront) {
       this._getEnvironmentFront = aOptions.getEnvironmentFront;
     }
     if (aOptions.releaseActor) {
@@ -240,53 +240,53 @@ VariablesViewController.prototype = {
    *        The grip to use to populate the target.
    * @param string aQuery [optional]
    *        The query string used to fetch only a subset of properties
    */
   _populateFromObjectWithIterator: function(aTarget, aGrip, aQuery) {
     // FF40+ starts exposing `ownPropertyLength` on ObjectActor's grip,
     // as well as `enumProperties` request.
     const deferred = defer();
-    const objectClient = this._getObjectClient(aGrip);
+    const objectFront = this._getObjectFront(aGrip);
     const isArray = aGrip.preview && aGrip.preview.kind === "ArrayLike";
     if (isArray) {
       // First enumerate array items, e.g. properties from `0` to `array.length`.
       const options = {
         ignoreNonIndexedProperties: true,
         query: aQuery,
       };
-      objectClient.enumProperties(options).then(iterator => {
+      objectFront.enumProperties(options).then(iterator => {
         const sliceGrip = {
           type: "property-iterator",
           propertyIterator: iterator,
           start: 0,
           count: iterator.count,
         };
         this._populatePropertySlices(aTarget, sliceGrip).then(() => {
           // Then enumerate the rest of the properties, like length, buffer, etc.
           const options = {
             ignoreIndexedProperties: true,
             sort: true,
             query: aQuery,
           };
-          objectClient.enumProperties(options).then(iterator => {
+          objectFront.enumProperties(options).then(iterator => {
             const sliceGrip = {
               type: "property-iterator",
               propertyIterator: iterator,
               start: 0,
               count: iterator.count,
             };
             deferred.resolve(this._populatePropertySlices(aTarget, sliceGrip));
           });
         });
       });
     } else {
       const options = { sort: true, query: aQuery };
       // For objects, we just enumerate all the properties sorted by name.
-      objectClient.enumProperties(options).then(iterator => {
+      objectFront.enumProperties(options).then(iterator => {
         const sliceGrip = {
           type: "property-iterator",
           propertyIterator: iterator,
           start: 0,
           count: iterator.count,
         };
         deferred.resolve(this._populatePropertySlices(aTarget, sliceGrip));
       });
@@ -318,18 +318,18 @@ VariablesViewController.prototype = {
    *        The Scope where the properties will be placed into.
    * @param object aGrip
    *        The grip to use to populate the target.
    */
   _populateFromObject: function(aTarget, aGrip) {
     if (aGrip.class === "Proxy") {
       // Refuse to play the proxy's stupid game and just expose the target and handler.
       const deferred = defer();
-      const objectClient = this._getObjectClient(aGrip);
-      objectClient.getProxySlots().then(aResponse => {
+      const objectFront = this._getObjectFront(aGrip);
+      objectFront.getProxySlots().then(aResponse => {
         const target = aTarget.addItem(
           "<target>",
           { value: aResponse.proxyTarget },
           { internalItem: true }
         );
         this.addExpander(target, aResponse.proxyTarget);
         const handler = aTarget.addItem(
           "<handler>",
@@ -375,33 +375,33 @@ VariablesViewController.prototype = {
 
     // Fetch properties by slices if there is too many in order to prevent UI freeze.
     if (
       "ownPropertyLength" in aGrip &&
       aGrip.ownPropertyLength >= MAX_PROPERTY_ITEMS
     ) {
       return this._populateFromObjectWithIterator(aTarget, aGrip).then(() => {
         const deferred = defer();
-        const objectClient = this._getObjectClient(aGrip);
-        objectClient.getPrototype().then(prototype => {
+        const objectFront = this._getObjectFront(aGrip);
+        objectFront.getPrototype().then(prototype => {
           this._populateObjectPrototype(aTarget, prototype);
           deferred.resolve();
         });
         return deferred.promise;
       });
     }
 
     return this._populateProperties(aTarget, aGrip);
   },
 
   _populateProperties: function(aTarget, aGrip, aOptions) {
     const deferred = defer();
 
-    const objectClient = this._getObjectClient(aGrip);
-    objectClient.getPrototypeAndProperties().then(aResponse => {
+    const objectFront = this._getObjectFront(aGrip);
+    objectFront.getPrototypeAndProperties().then(aResponse => {
       const ownProperties = aResponse.ownProperties || {};
       const prototype = aResponse.prototype || null;
       // 'safeGetterValues' is new and isn't necessary defined on old actors.
       const safeGetterValues = aResponse.safeGetterValues || {};
       const sortable = VariablesView.isSortable(aGrip.class);
 
       // Merge the safe getter values into one object such that we can use it
       // in VariablesView.
@@ -424,17 +424,17 @@ VariablesViewController.prototype = {
       });
 
       // Add the variable's __proto__.
       this._populateObjectPrototype(aTarget, prototype);
 
       // If the object is a function we need to fetch its scope chain
       // to show them as closures for the respective function.
       if (aGrip.class == "Function") {
-        objectClient.getScope().then(aResponse => {
+        objectFront.getScope().then(aResponse => {
           if (aResponse.error) {
             // This function is bound to a built-in object or it's not present
             // in the current scope chain. Not necessarily an actual error,
             // it just means that there's no closure for the function.
             console.warn(aResponse.error + ": " + aResponse.message);
             return void deferred.resolve();
           }
           this._populateWithClosure(aTarget, aResponse.scope).then(
@@ -525,21 +525,21 @@ VariablesViewController.prototype = {
       sorted: VARIABLES_SORTING_ENABLED,
       // Expansion handlers must be set after the properties are added.
       callback: this.addExpander,
     });
   },
 
   _populateFromEntries: function(target, grip) {
     const objGrip = grip.obj;
-    const objectClient = this._getObjectClient(objGrip);
+    const objectFront = this._getObjectFront(objGrip);
 
     // eslint-disable-next-line new-cap
     return new promise((resolve, reject) => {
-      objectClient.enumEntries().then(response => {
+      objectFront.enumEntries().then(response => {
         if (response.error) {
           // Older server might not support the enumEntries method
           console.warn(response.error + ": " + response.message);
           resolve();
         } else {
           const sliceGrip = {
             type: "property-iterator",
             propertyIterator: response.iterator,
--- a/devtools/client/webconsole/commands.js
+++ b/devtools/client/webconsole/commands.js
@@ -1,31 +1,31 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-const ObjectClient = require("devtools/shared/client/object-client");
+const ObjectFront = require("devtools/shared/fronts/object");
 const LongStringClient = require("devtools/shared/client/long-string-client");
 
 class ConsoleCommands {
   constructor({ debuggerClient, proxy, threadFront, currentTarget }) {
     this.debuggerClient = debuggerClient;
     this.proxy = proxy;
     this.threadFront = threadFront;
     this.currentTarget = currentTarget;
   }
 
   evaluateJSAsync(expression, options) {
     return this.proxy.webConsoleFront.evaluateJSAsync(expression, options);
   }
 
-  createObjectClient(object) {
-    return new ObjectClient(this.debuggerClient, object);
+  createObjectFront(object) {
+    return new ObjectFront(this.debuggerClient, object);
   }
 
   createLongStringClient(object) {
     return new LongStringClient(this.debuggerClient, object);
   }
 
   releaseActor(actor) {
     if (!actor) {
@@ -37,26 +37,26 @@ class ConsoleCommands {
       return objFront.release();
     }
 
     // In case there's no object front, use the client's release method.
     return this.debuggerClient.release(actor).catch(() => {});
   }
 
   async fetchObjectProperties(grip, ignoreNonIndexedProperties) {
-    const client = new ObjectClient(this.currentTarget.client, grip);
+    const client = new ObjectFront(this.currentTarget.client, grip);
     const iterator = await client.enumProperties({
       ignoreNonIndexedProperties,
     });
     const { ownProperties } = await iterator.slice(0, iterator.count);
     return ownProperties;
   }
 
   async fetchObjectEntries(grip) {
-    const client = new ObjectClient(this.currentTarget.client, grip);
+    const client = new ObjectFront(this.currentTarget.client, grip);
     const iterator = await client.enumEntries();
     const { ownProperties } = await iterator.slice(0, iterator.count);
     return ownProperties;
   }
 
   timeWarp(executionPoint) {
     return this.threadFront.timeWarp(executionPoint);
   }
--- a/devtools/client/webconsole/test/browser/browser_console_cpow.js
+++ b/devtools/client/webconsole/test/browser/browser_console_cpow.js
@@ -1,16 +1,16 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Test the basic features of the Browser Console.
 
 "use strict";
 
-const ObjectClient = require("devtools/shared/client/object-client");
+const ObjectFront = require("devtools/shared/fronts/object");
 
 const {
   gDevToolsBrowser,
 } = require("devtools/client/framework/devtools-browser");
 
 add_task(async function() {
   await addTab("about:blank");
 
@@ -67,30 +67,30 @@ async function testFrontEnd(hud, message
   expandObjectInspectorNode(cpow);
   is(getObjectInspectorChildrenNodes(cpow).length, 0, "CPOW has no children");
 }
 
 async function testBackEnd(hud, actor) {
   // Check that inspecting an object with CPOW doesn't throw in the server.
   // This would be done in a mochitest-chrome suite, but that doesn't run in
   // e10s, so it's harder to get ahold of a CPOW.
-  info("Creating an ObjectClient with: " + actor);
-  const objectClient = new ObjectClient(hud.ui.proxy.client, { actor });
+  info("Creating an ObjectFront with: " + actor);
+  const objectFront = new ObjectFront(hud.ui.proxy.client, { actor });
 
   // Before the fix for Bug 1382833, this wouldn't resolve due to a CPOW error
   // in the ObjectActor.
-  const prototypeAndProperties = await objectClient.getPrototypeAndProperties();
+  const prototypeAndProperties = await objectFront.getPrototypeAndProperties();
 
   // The CPOW is in the "cpow" property.
   const cpow = prototypeAndProperties.ownProperties.cpow.value;
 
   is(cpow.class, "CPOW", "The CPOW grip has the right class.");
 
   // Check that various protocol request methods work for the CPOW.
-  const objClient = new ObjectClient(hud.ui.proxy.client, cpow);
+  const objClient = new ObjectFront(hud.ui.proxy.client, cpow);
 
   let response = await objClient.getPrototypeAndProperties();
   is(
     Reflect.ownKeys(response.ownProperties).length,
     0,
     "No property was retrieved."
   );
   is(response.ownSymbols.length, 0, "No symbol property was retrieved.");
--- a/devtools/client/webconsole/test/node/mocha-test-setup.js
+++ b/devtools/client/webconsole/test/node/mocha-test-setup.js
@@ -107,17 +107,17 @@ requireHacker.global_hook("default", (pa
     // is required, replace it with a mock version.
     "devtools/shared/l10n": () =>
       getModule(
         "devtools/client/webconsole/test/node/fixtures/LocalizationHelper"
       ),
     "devtools/shared/plural-form": () =>
       getModule("devtools/client/webconsole/test/node/fixtures/PluralForm"),
     Services: () => `module.exports = require("devtools-services")`,
-    "devtools/shared/client/object-client": () => `() => {}`,
+    "devtools/shared/fronts/object": () => `() => {}`,
     "devtools/shared/client/long-string-client": () => `() => {}`,
     "devtools/client/shared/components/SmartTrace": () => "{}",
     "devtools/client/netmonitor/src/components/TabboxPanel": () => "{}",
     "devtools/client/webconsole/utils/context-menu": () => "{}",
     "devtools/client/shared/telemetry": () => `module.exports = function() {
       this.recordEvent = () => {};
       this.getKeyedHistogramById = () => ({add: () => {}});
     }`,
--- a/devtools/docs/backend/client-api.md
+++ b/devtools/docs/backend/client-api.md
@@ -2,18 +2,18 @@
 
 DevTools has a client module that allows applications to be written that debug or inspect web pages using the [Remote Debugging Protocol](protocol.md).
 
 ## Starting communication
 
 In order to communicate, a client and a server instance must be created and a protocol connection must be established. The connection can be either over a TCP socket or an nsIPipe. The `start` function displayed below establishes an nsIPipe-backed connection:
 
 ```javascript
-Components.utils.import("resource://gre/modules/devtools/dbg-server.jsm");
-Components.utils.import("resource://gre/modules/devtools/dbg-client.jsm");
+const { DebuggerServer } = require("devtools/server/debugger-server");
+const { DebuggerClient } = require("devtools/shared/client/debugger-client");
 
 function start() {
   // Start the server.
   DebuggerServer.init();
   DebuggerServer.registerAllActors();
 
   // Listen to an nsIPipe
   let transport = DebuggerServer.connectPipe();
@@ -26,18 +26,18 @@ function start() {
     debugTab();
   });
 }
 ```
 
 If a TCP socket is required, the function should be split in two parts, a server-side and a client-side, like this:
 
 ```javascript
-Components.utils.import("resource://gre/modules/devtools/dbg-server.jsm");
-Components.utils.import("resource://gre/modules/devtools/dbg-client.jsm");
+const { DebuggerServer } = require("devtools/server/debugger-server");
+const { DebuggerClient } = require("devtools/shared/client/debugger-client");
 
 function startServer() {
   // Start the server.
   DebuggerServer.init();
   DebuggerServer.registerAllActors();
 
   // For an nsIServerSocket we do this:
   DebuggerServer.openListener(2929); // A connection on port 2929.
@@ -135,18 +135,18 @@ client.attachThread(response.threadActor
 Here is the source code for a complete debugger application:
 
 ```javascript
 /*
  * Debugger API demo.
  * Try it in Scratchpad with Environment -> Browser, using
  * http://htmlpad.org/debugger/ as the current page.
  */
-Components.utils.import("resource://gre/modules/devtools/dbg-server.jsm");
-Components.utils.import("resource://gre/modules/devtools/dbg-client.jsm");
+const { DebuggerServer } = require("devtools/server/debugger-server");
+const { DebuggerClient } = require("devtools/shared/client/debugger-client");
 
 let client;
 let threadFront;
 
 function startDebugger() {
   // Start the server.
   DebuggerServer.init();
   DebuggerServer.registerAllActors();
--- a/devtools/server/tests/unit/head_dbg.js
+++ b/devtools/server/tests/unit/head_dbg.js
@@ -38,17 +38,17 @@ const DevToolsUtils = require("devtools/
 const {
   ActorRegistry,
 } = require("devtools/server/actors/utils/actor-registry");
 const { DebuggerServer } = require("devtools/server/debugger-server");
 const { DebuggerServer: WorkerDebuggerServer } = worker.require(
   "devtools/server/debugger-server"
 );
 const { DebuggerClient } = require("devtools/shared/client/debugger-client");
-const ObjectClient = require("devtools/shared/client/object-client");
+const ObjectFront = require("devtools/shared/fronts/object");
 const { LongStringFront } = require("devtools/shared/fronts/string");
 const { TargetFactory } = require("devtools/client/framework/target");
 
 const { addDebuggerToGlobal } = ChromeUtils.import(
   "resource://gre/modules/jsdebugger.jsm"
 );
 
 const systemPrincipal = Cc["@mozilla.org/systemprincipal;1"].createInstance(
--- a/devtools/server/tests/unit/test_objectgrips-13.js
+++ b/devtools/server/tests/unit/test_objectgrips-13.js
@@ -1,14 +1,14 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
-// Test that ObjectClient.prototype.getDefinitionSite and the "definitionSite"
+// Test that ObjectFront.prototype.getDefinitionSite and the "definitionSite"
 // request work properly.
 
 var gDebuggee;
 var gClient;
 var gThreadFront;
 
 function run_test() {
   initTestDebuggerServer();
--- a/devtools/server/tests/unit/test_objectgrips-21.js
+++ b/devtools/server/tests/unit/test_objectgrips-21.js
@@ -268,17 +268,17 @@ async function test_unsafe_grips(
 
           response = await objClient.getPrototype();
           check_prototype(response.prototype, data, isUnsafe);
 
           response = await objClient.getDisplayString();
           check_display_string(response.displayString, data, isUnsafe);
 
           if (data.isFunction && isUnsafe) {
-            // For function-related methods, object-client.js checks that the class
+            // For function-related methods, the object front checks that the class
             // of the grip is "Function", and if it's not, the method in object.js
             // is not called. But some tests have a grip with a class that is not
             // "Function" (e.g. it's "Proxy") but the DebuggerObject has a "Function"
             // class because the object is callable (despite not being a Function object).
             // So the grip class is changed in order to test the object.js method.
             grip.class = "Function";
             objClient = threadFront.pauseGrip(grip);
             try {
--- a/devtools/server/tests/unit/test_threadlifetime-02.js
+++ b/devtools/server/tests/unit/test_threadlifetime-02.js
@@ -43,19 +43,19 @@ function test_thread_lifetime() {
       type: "threadGrip",
     });
     // Successful promotion won't return an error.
     Assert.equal(response.error, undefined);
     gThreadFront.once("paused", async function(packet) {
       // Verify that the promoted actor is returned again.
       Assert.equal(pauseGrip.actor, packet.frame.arguments[0].actor);
       // Now that we've resumed, release the thread-lifetime grip.
-      const objFront = new ObjectClient(gClient, pauseGrip);
+      const objFront = new ObjectFront(gClient, pauseGrip);
       await objFront.release();
-      const objFront2 = new ObjectClient(gClient, pauseGrip);
+      const objFront2 = new ObjectFront(gClient, pauseGrip);
 
       try {
         await objFront2
           .request({ to: pauseGrip.actor, type: "bogusRequest" })
           .catch(function(response) {
             Assert.ok(!!response.match(/noSuchActor/));
             gThreadFront.resume().then(function() {
               finishClient(gClient);
--- a/devtools/shared/client/debugger-client.js
+++ b/devtools/shared/client/debugger-client.js
@@ -30,21 +30,17 @@ loader.lazyRequireGetter(
 loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter");
 
 loader.lazyRequireGetter(
   this,
   "RootFront",
   "devtools/shared/fronts/root",
   true
 );
-loader.lazyRequireGetter(
-  this,
-  "ObjectClient",
-  "devtools/shared/client/object-client"
-);
+loader.lazyRequireGetter(this, "ObjectFront", "devtools/shared/fronts/object");
 loader.lazyRequireGetter(this, "Front", "devtools/shared/protocol", true);
 
 /**
  * Creates a client for the remote debugging protocol server. This client
  * provides the means to communicate with the server and exchange the messages
  * required by the protocol in a traditional JavaScript API.
  */
 function DebuggerClient(transport) {
@@ -948,22 +944,22 @@ DebuggerClient.prototype = {
   },
 
   /**
    * Currently attached addon.
    */
   activeAddon: null,
 
   /**
-   * Creates an object client for this DebuggerClient and the grip in parameter,
-   * @param {Object} grip: The grip to create the ObjectClient for.
-   * @returns {ObjectClient}
+   * Creates an object front for this DebuggerClient and the grip in parameter,
+   * @param {Object} grip: The grip to create the ObjectFront for.
+   * @returns {ObjectFront}
    */
-  createObjectClient: function(grip) {
-    return new ObjectClient(this, grip);
+  createObjectFront: function(grip) {
+    return new ObjectFront(this, grip);
   },
 
   get transport() {
     return this._transport;
   },
 };
 
 EventEmitter.decorate(DebuggerClient.prototype);
--- a/devtools/shared/client/deprecated-thread-client.js
+++ b/devtools/shared/client/deprecated-thread-client.js
@@ -6,21 +6,17 @@
 
 const {
   arg,
   DebuggerClient,
 } = require("devtools/shared/client/debugger-client");
 const EventEmitter = require("devtools/shared/event-emitter");
 const { ThreadStateTypes } = require("devtools/shared/client/constants");
 
-loader.lazyRequireGetter(
-  this,
-  "ObjectClient",
-  "devtools/shared/client/object-client"
-);
+loader.lazyRequireGetter(this, "ObjectFront", "devtools/shared/client/object");
 loader.lazyRequireGetter(
   this,
   "SourceFront",
   "devtools/shared/fronts/source",
   true
 );
 
 /**
@@ -287,58 +283,58 @@ ThreadClient.prototype = {
    *
    * @param frameId string
    */
   getEnvironment: function(frameId) {
     return this.request({ to: frameId, type: "getEnvironment" });
   },
 
   /**
-   * Return a ObjectClient object for the given object grip.
+   * Return a ObjectFront object for the given object grip.
    *
    * @param grip object
    *        A pause-lifetime object grip returned by the protocol.
    */
   pauseGrip: function(grip) {
     if (grip.actor in this._pauseGrips) {
       return this._pauseGrips[grip.actor];
     }
 
-    const client = new ObjectClient(this.client, grip);
-    this._pauseGrips[grip.actor] = client;
-    return client;
+    const objectFront = new ObjectFront(this.client, grip);
+    this._pauseGrips[grip.actor] = objectFront;
+    return objectFront;
   },
 
   /**
-   * Clear and invalidate all the grip clients from the given cache.
+   * Clear and invalidate all the grip fronts from the given cache.
    *
    * @param gripCacheName
    *        The property name of the grip cache we want to clear.
    */
-  _clearObjectClients: function(gripCacheName) {
+  _clearObjectFronts: function(gripCacheName) {
     for (const id in this[gripCacheName]) {
       this[gripCacheName][id].valid = false;
     }
     this[gripCacheName] = {};
   },
 
   /**
    * Invalidate pause-lifetime grip clients and clear the list of current grip
    * clients.
    */
   _clearPauseGrips: function() {
-    this._clearObjectClients("_pauseGrips");
+    this._clearObjectFronts("_pauseGrips");
   },
 
   /**
    * Invalidate thread-lifetime grip clients and clear the list of current grip
    * clients.
    */
   _clearThreadGrips: function() {
-    this._clearObjectClients("_threadGrips");
+    this._clearObjectFronts("_threadGrips");
   },
 
   /**
    * Handle thread state change by doing necessary cleanup and notifying all
    * registered listeners.
    */
   _onThreadState: function(packet) {
     this._state = ThreadStateTypes[packet.type];
--- a/devtools/shared/client/moz.build
+++ b/devtools/shared/client/moz.build
@@ -6,10 +6,9 @@
 
 DevToolsModules(
     'connection-manager.js',
     'constants.js',
     'debugger-client.js',
     'deprecated-thread-client.js',
     'event-source.js',
     'long-string-client.js',
-    'object-client.js',
 )
--- a/devtools/shared/fronts/moz.build
+++ b/devtools/shared/fronts/moz.build
@@ -24,16 +24,17 @@ DevToolsModules(
     'environment.js',
     'framerate.js',
     'highlighters.js',
     'inspector.js',
     'layout.js',
     'manifest.js',
     'memory.js',
     'node.js',
+    'object.js',
     'perf.js',
     'performance-recording.js',
     'performance.js',
     'preference.js',
     'property-iterator.js',
     'reflow.js',
     'root.js',
     'screenshot.js',
rename from devtools/shared/client/object-client.js
rename to devtools/shared/fronts/object.js
--- a/devtools/shared/client/object-client.js
+++ b/devtools/shared/fronts/object.js
@@ -13,17 +13,17 @@ const {
 /**
  * Grip clients are used to retrieve information about the relevant object.
  *
  * @param client DebuggerClient
  *        The debugger client parent.
  * @param grip object
  *        A pause-lifetime object grip returned by the protocol.
  */
-class ObjectClient extends FrontClassWithSpec(objectSpec) {
+class ObjectFront extends FrontClassWithSpec(objectSpec) {
   constructor(client, grip) {
     super(client);
     this._grip = grip;
     this._client = client;
     this.valid = true;
     this.actorID = this._grip.actor;
 
     this.manage(this);
@@ -193,10 +193,10 @@ class ObjectClient extends FrontClassWit
       const { proxyTarget, proxyHandler } = this._grip;
       return { proxyTarget, proxyHandler };
     }
 
     return response;
   }
 }
 
-module.exports = ObjectClient;
-registerFront(ObjectClient);
+module.exports = ObjectFront;
+registerFront(ObjectFront);
--- a/devtools/shared/fronts/property-iterator.js
+++ b/devtools/shared/fronts/property-iterator.js
@@ -12,17 +12,17 @@ const {
   propertyIteratorSpec,
 } = require("devtools/shared/specs/property-iterator");
 
 /**
  * A PropertyIteratorFront provides a way to access to property names and
  * values of an object efficiently, slice by slice.
  * Note that the properties can be sorted in the backend,
  * this is controled while creating the PropertyIteratorFront
- * from ObjectClient.enumProperties.
+ * from ObjectFront.enumProperties.
  */
 class PropertyIteratorFront extends FrontClassWithSpec(propertyIteratorSpec) {
   constructor(client, targetFront, parentFront) {
     super(client, targetFront, parentFront);
     this._client = client;
   }
 
   get actor() {
--- a/devtools/shared/fronts/thread.js
+++ b/devtools/shared/fronts/thread.js
@@ -6,21 +6,17 @@
 
 const { ThreadStateTypes } = require("devtools/shared/client/constants");
 const {
   FrontClassWithSpec,
   registerFront,
 } = require("devtools/shared/protocol");
 const { threadSpec } = require("devtools/shared/specs/thread");
 
-loader.lazyRequireGetter(
-  this,
-  "ObjectClient",
-  "devtools/shared/client/object-client"
-);
+loader.lazyRequireGetter(this, "ObjectFront", "devtools/shared/fronts/object");
 loader.lazyRequireGetter(
   this,
   "SourceFront",
   "devtools/shared/fronts/source",
   true
 );
 
 /**
@@ -258,58 +254,58 @@ class ThreadFront extends FrontClassWith
    *
    * @param frameId string
    */
   getEnvironment(frameId) {
     return this.client.request({ to: frameId, type: "getEnvironment" });
   }
 
   /**
-   * Return a ObjectClient object for the given object grip.
+   * Return a ObjectFront object for the given object grip.
    *
    * @param grip object
    *        A pause-lifetime object grip returned by the protocol.
    */
   pauseGrip(grip) {
     if (grip.actor in this._pauseGrips) {
       return this._pauseGrips[grip.actor];
     }
 
-    const client = new ObjectClient(this.client, grip);
-    this._pauseGrips[grip.actor] = client;
-    return client;
+    const objectFront = new ObjectFront(this.client, grip);
+    this._pauseGrips[grip.actor] = objectFront;
+    return objectFront;
   }
 
   /**
-   * Clear and invalidate all the grip clients from the given cache.
+   * Clear and invalidate all the grip fronts from the given cache.
    *
    * @param gripCacheName
    *        The property name of the grip cache we want to clear.
    */
-  _clearObjectClients(gripCacheName) {
+  _clearObjectFronts(gripCacheName) {
     for (const id in this[gripCacheName]) {
       this[gripCacheName][id].valid = false;
     }
     this[gripCacheName] = {};
   }
 
   /**
    * Invalidate pause-lifetime grip clients and clear the list of current grip
    * clients.
    */
   _clearPauseGrips() {
-    this._clearObjectClients("_pauseGrips");
+    this._clearObjectFronts("_pauseGrips");
   }
 
   /**
    * Invalidate thread-lifetime grip clients and clear the list of current grip
    * clients.
    */
   _clearThreadGrips() {
-    this._clearObjectClients("_threadGrips");
+    this._clearObjectFronts("_threadGrips");
   }
 
   _beforePaused(packet) {
     this._state = "paused";
     this._onThreadState(packet);
   }
 
   _beforeResumed() {
--- a/devtools/shared/webconsole/test/common.js
+++ b/devtools/shared/webconsole/test/common.js
@@ -1,22 +1,22 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-/* exported ObjectClient, attachConsole, attachConsoleToTab, attachConsoleToWorker,
+/* exported ObjectFront, attachConsole, attachConsoleToTab, attachConsoleToWorker,
    closeDebugger, checkConsoleAPICalls, checkRawHeaders, runTests, nextTest, Ci, Cc,
    withActiveServiceWorker, Services, consoleAPICall */
 
 const { require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm");
 const { DebuggerServer } = require("devtools/server/debugger-server");
 const { DebuggerClient } = require("devtools/shared/client/debugger-client");
-const ObjectClient = require("devtools/shared/client/object-client");
+const ObjectFront = require("devtools/shared/fronts/object");
 const Services = require("Services");
 
 function initCommon() {
   // Services.prefs.setBoolPref("devtools.debugger.log", true);
 }
 
 function initDebuggerServer() {
   DebuggerServer.init();
--- a/devtools/shared/webconsole/test/test_bug819670_getter_throws.html
+++ b/devtools/shared/webconsole/test/test_bug819670_getter_throws.html
@@ -36,17 +36,17 @@ function onEvaluate(aState, aResponse)
       actor: /[a-z]/,
     },
   });
 
   ok(!aResponse.exception, "no eval exception");
   ok(!aResponse.helperResult, "no helper result");
 
   onInspect = onInspect.bind(null, aState);
-  let client = new ObjectClient(aState.dbgClient, aResponse.result);
+  let client = new ObjectFront(aState.dbgClient, aResponse.result);
   client.getPrototypeAndProperties().then(onInspect);
 }
 
 function onInspect(aState, aResponse)
 {
   ok(!aResponse.error, "no response error");
 
   let expectedProps =  Object.getOwnPropertyNames(document.__proto__);
--- a/devtools/shared/webconsole/test/test_object_actor.html
+++ b/devtools/shared/webconsole/test/test_object_actor.html
@@ -147,17 +147,17 @@ function onConsoleCall(state, aPacket) {
   });
 
   state.webConsoleFront.off("consoleAPICall", onConsoleCall);
 
   info("inspecting object properties");
   let args = aPacket.message.arguments;
   onProperties = onProperties.bind(null, state);
 
-  let client = new ObjectClient(state.dbgClient, args[1]);
+  let client = new ObjectFront(state.dbgClient, args[1]);
   client.getPrototypeAndProperties().then(onProperties);
 }
 
 function onProperties(state, response) {
   let props = response.ownProperties;
   is(Object.keys(props).length, Object.keys(expectedProps).length,
      "number of enumerable properties");
   checkObject(props, expectedProps);
--- a/devtools/shared/webconsole/test/test_object_actor_native_getters.html
+++ b/devtools/shared/webconsole/test/test_object_actor_native_getters.html
@@ -68,17 +68,17 @@ function onConsoleCall(aState, aPacket)
   });
 
   aState.webConsoleFront.off("consoleAPICall", onConsoleCall);
 
   info("inspecting object properties");
   let args = aPacket.message.arguments;
   onProperties = onProperties.bind(null, aState);
 
-  let client = new ObjectClient(aState.dbgClient, args[1]);
+  let client = new ObjectFront(aState.dbgClient, args[1]);
   client.getPrototypeAndProperties().then(onProperties);
 }
 
 function onProperties(aState, aResponse)
 {
   let props = aResponse.ownProperties;
   let keys = Object.keys(props);
   info(keys.length + " ownProperties: " + keys);
--- a/devtools/shared/webconsole/test/test_object_actor_native_getters_lenient_this.html
+++ b/devtools/shared/webconsole/test/test_object_actor_native_getters_lenient_this.html
@@ -47,17 +47,17 @@ function onConsoleCall(aState, aPacket)
   });
 
   aState.webConsoleFront.off("consoleAPICall", onConsoleCall);
 
   info("inspecting object properties");
   let args = aPacket.message.arguments;
   onProperties = onProperties.bind(null, aState);
 
-  let client = new ObjectClient(aState.dbgClient, args[1]);
+  let client = new ObjectFront(aState.dbgClient, args[1]);
   client.getPrototypeAndProperties().then(onProperties);
 }
 
 function onProperties(aState, aResponse)
 {
   let props = aResponse.ownProperties;
   let keys = Object.keys(props);
   info(keys.length + " ownProperties: " + keys);
--- a/tools/lint/eslint/modules.json
+++ b/tools/lint/eslint/modules.json
@@ -38,18 +38,16 @@
   "content-process.jsm": ["init"],
   "content.jsm": ["registerContentFrame"],
   "ContentCrashHandlers.jsm": ["TabCrashHandler", "SubframeCrashHandler", "UnsubmittedCrashHandler"],
   "ContentObservers.js": [],
   "ContentPrefUtils.jsm": ["ContentPref", "cbHandleResult", "cbHandleError", "cbHandleCompletion", "safeCallback", "_methodsCallableFromChild"],
   "cookies.js": ["Cookies"],
   "CoverageUtils.jsm": ["CoverageCollector"],
   "CrashManagerTest.jsm": ["configureLogging", "getManager", "sleep", "TestingCrashManager"],
-  "dbg-client.jsm": ["DebuggerTransport", "DebuggerClient", "RootClient", "LongStringClient", "EnvironmentClient", "ObjectClient"],
-  "dbg-server.jsm": ["DebuggerServer", "ActorPool", "OriginalLocation"],
   "declined.js": ["DeclinedEngines"],
   "distribution.js": ["DistributionCustomizer"],
   "DNSTypes.jsm": ["DNS_QUERY_RESPONSE_CODES", "DNS_AUTHORITATIVE_ANSWER_CODES", "DNS_CLASS_CODES", "DNS_RECORD_TYPES"],
   "doctor.js": ["Doctor"],
   "dom.js": ["ContentEventObserverService", "WebElementEventTarget"],
   "DOMRequestHelper.jsm": ["DOMRequestIpcHelper"],
   "DownloadCore.jsm": ["Download", "DownloadSource", "DownloadTarget", "DownloadError", "DownloadSaver", "DownloadCopySaver", "DownloadLegacySaver", "DownloadPDFSaver"],
   "DownloadList.jsm": ["DownloadList", "DownloadCombinedList", "DownloadSummary"],