Bug 1307940 - Add toolbox-dependent method to serviceContainer only if toolbox is available. r=bgrins draft
authornchevobbe <nchevobbe@mozilla.com>
Mon, 24 Apr 2017 10:09:27 +0200
changeset 566993 bcea8a34b484f6d53592ab72aebf234e75eb2830
parent 566992 31fbc42329627feefd436c6e11d8f09ae1757537
child 625485 e79ac7088fd5b0958dcc6effa128ffa8550c38f7
push id55402
push userbmo:nchevobbe@mozilla.com
push dateMon, 24 Apr 2017 09:07:40 +0000
reviewersbgrins
bugs1307940
milestone55.0a1
Bug 1307940 - Add toolbox-dependent method to serviceContainer only if toolbox is available. r=bgrins MozReview-Commit-ID: CjRXKemaJ4f
devtools/client/webconsole/new-console-output/components/grip-message-body.js
devtools/client/webconsole/new-console-output/components/message-types/network-event-message.js
devtools/client/webconsole/new-console-output/components/message.js
devtools/client/webconsole/new-console-output/new-console-output-wrapper.js
--- a/devtools/client/webconsole/new-console-output/components/grip-message-body.js
+++ b/devtools/client/webconsole/new-console-output/components/grip-message-body.js
@@ -58,19 +58,23 @@ function GripMessageBody(props) {
   if (userProvidedStyle && userProvidedStyle !== "") {
     styleObject = cleanupStyle(userProvidedStyle, serviceContainer.createElement);
   }
 
   let onDOMNodeMouseOver;
   let onDOMNodeMouseOut;
   let onInspectIconClick;
   if (serviceContainer) {
-    onDOMNodeMouseOver = (object) => serviceContainer.highlightDomElement(object);
+    onDOMNodeMouseOver = serviceContainer.highlightDomElement
+      ? (object) => serviceContainer.highlightDomElement(object)
+      : null;
     onDOMNodeMouseOut = serviceContainer.unHighlightDomElement;
-    onInspectIconClick = (object) => serviceContainer.openNodeInInspector(object);
+    onInspectIconClick = serviceContainer.openNodeInInspector
+      ? (object) => serviceContainer.openNodeInInspector(object)
+      : null;
   }
 
   return (
     // @TODO once there is a longString rep, also turn off quotes for those.
     typeof grip === "string"
       ? StringRep({
         object: grip,
         useQuotes: useQuotes,
--- a/devtools/client/webconsole/new-console-output/components/message-types/network-event-message.js
+++ b/devtools/client/webconsole/new-console-output/components/message-types/network-event-message.js
@@ -52,19 +52,19 @@ function NetworkEventMessage({
 
   const topLevelClasses = [ "cm-s-mozilla" ];
   let statusInfo;
 
   if (httpVersion && status && statusText && totalTime !== undefined) {
     statusInfo = `[${httpVersion} ${status} ${statusText} ${totalTime}ms]`;
   }
 
-  function openNetworkMonitor() {
-    serviceContainer.openNetworkPanel(actor);
-  }
+  const openNetworkMonitor = serviceContainer.openNetworkPanel
+    ? () => serviceContainer.openNetworkPanel(actor)
+    : null;
 
   const method = dom.span({className: "method" }, request.method);
   const xhr = isXHR
     ? dom.span({ className: "xhr" }, l10n.getStr("webConsoleXhrIndicator"))
     : null;
   const url = dom.a({ className: "url", title: request.url, onClick: openNetworkMonitor },
     request.url.replace(/\?.+/, ""));
   const statusBody = statusInfo
--- a/devtools/client/webconsole/new-console-output/components/message.js
+++ b/devtools/client/webconsole/new-console-output/components/message.js
@@ -44,19 +44,19 @@ const Message = createClass({
     scrollToMessage: PropTypes.bool,
     exceptionDocURL: PropTypes.string,
     parameters: PropTypes.object,
     request: PropTypes.object,
     dispatch: PropTypes.func,
     timeStamp: PropTypes.number,
     serviceContainer: PropTypes.shape({
       emitNewMessage: PropTypes.func.isRequired,
-      onViewSourceInDebugger: PropTypes.func.isRequired,
-      onViewSourceInScratchpad: PropTypes.func.isRequired,
-      onViewSourceInStyleEditor: PropTypes.func.isRequired,
+      onViewSourceInDebugger: PropTypes.func,
+      onViewSourceInScratchpad: PropTypes.func,
+      onViewSourceInStyleEditor: PropTypes.func,
       openContextMenu: PropTypes.func.isRequired,
       openLink: PropTypes.func.isRequired,
       sourceMapService: PropTypes.any,
     }),
     notes: PropTypes.arrayOf(PropTypes.shape({
       messageBody: PropTypes.string.isRequired,
       frame: PropTypes.any,
     })),
--- a/devtools/client/webconsole/new-console-output/new-console-output-wrapper.js
+++ b/devtools/client/webconsole/new-console-output/new-console-output-wrapper.js
@@ -33,98 +33,99 @@ function NewConsoleOutputWrapper(parentN
 }
 
 NewConsoleOutputWrapper.prototype = {
   init: function () {
     const attachRefToHud = (id, node) => {
       this.jsterm.hud[id] = node;
     };
 
-    let childComponent = ConsoleOutput({
-      serviceContainer: {
-        attachRefToHud,
-        emitNewMessage: (node, messageId) => {
-          this.jsterm.hud.emit("new-messages", new Set([{
-            node,
-            messageId,
-          }]));
-        },
-        hudProxyClient: this.jsterm.hud.proxy.client,
+    const serviceContainer = {
+      attachRefToHud,
+      emitNewMessage: (node, messageId) => {
+        this.jsterm.hud.emit("new-messages", new Set([{
+          node,
+          messageId,
+        }]));
+      },
+      hudProxyClient: this.jsterm.hud.proxy.client,
+      openContextMenu: (e, message) => {
+        let { screenX, screenY, target } = e;
+
+        let messageEl = target.closest(".message");
+        let clipboardText = messageEl ? messageEl.textContent : null;
+
+        // Retrieve closes actor id from the DOM.
+        let actorEl = target.closest("[data-link-actor-id]");
+        let actor = actorEl ? actorEl.dataset.linkActorId : null;
+
+        let menu = createContextMenu(this.jsterm, this.parentNode,
+          { actor, clipboardText, message });
+
+        // Emit the "menu-open" event for testing.
+        menu.once("open", () => this.emit("menu-open"));
+        menu.popup(screenX, screenY, this.toolbox);
+
+        return menu;
+      },
+      openLink: url => this.jsterm.hud.owner.openLink(url),
+      createElement: nodename => {
+        return this.document.createElementNS("http://www.w3.org/1999/xhtml", nodename);
+      },
+    };
+
+    if (this.toolbox) {
+      Object.assign(serviceContainer, {
         onViewSourceInDebugger: frame => {
           this.toolbox.viewSourceInDebugger(frame.url, frame.line).then(() =>
             this.jsterm.hud.emit("source-in-debugger-opened")
           );
         },
         onViewSourceInScratchpad: frame => this.toolbox.viewSourceInScratchpad(
           frame.url,
           frame.line
         ),
         onViewSourceInStyleEditor: frame => this.toolbox.viewSourceInStyleEditor(
           frame.url,
           frame.line
         ),
-        openContextMenu: (e, message) => {
-          let { screenX, screenY, target } = e;
-
-          let messageEl = target.closest(".message");
-          let clipboardText = messageEl ? messageEl.textContent : null;
-
-          // Retrieve closes actor id from the DOM.
-          let actorEl = target.closest("[data-link-actor-id]");
-          let actor = actorEl ? actorEl.dataset.linkActorId : null;
-
-          let menu = createContextMenu(this.jsterm, this.parentNode,
-            { actor, clipboardText, message });
-
-          // Emit the "menu-open" event for testing.
-          menu.once("open", () => this.emit("menu-open"));
-          menu.popup(screenX, screenY, this.toolbox);
-
-          return menu;
-        },
         openNetworkPanel: (requestId) => {
           return this.toolbox.selectTool("netmonitor").then(panel => {
             return panel.panelWin.NetMonitorController.inspectRequest(requestId);
           });
         },
         sourceMapService:
           this.toolbox ? this.toolbox._deprecatedServerSourceMapService : null,
-        openLink: url => this.jsterm.hud.owner.openLink(url),
-        createElement: nodename => {
-          return this.document.createElementNS("http://www.w3.org/1999/xhtml", nodename);
-        },
         highlightDomElement: (grip, options = {}) => {
-          return this.toolbox && this.toolbox.highlighterUtils
+          return this.toolbox.highlighterUtils
             ? this.toolbox.highlighterUtils.highlightDomValueGrip(grip, options)
             : null;
         },
         unHighlightDomElement: (forceHide = false) => {
-          return this.toolbox && this.toolbox.highlighterUtils
+          return this.toolbox.highlighterUtils
             ? this.toolbox.highlighterUtils.unhighlight(forceHide)
             : null;
         },
         openNodeInInspector: async (grip) => {
-          if (!this.toolbox) {
-            return Promise.reject("no toolbox");
-          }
-
           let onSelectInspector = this.toolbox.selectTool("inspector");
           let onGripNodeToFront = this.toolbox.highlighterUtils.gripToNodeFront(grip);
           let [
             front,
             inspector
           ] = await Promise.all([onGripNodeToFront, onSelectInspector]);
 
           let onInspectorUpdated = inspector.once("inspector-updated");
           let onNodeFrontSet = this.toolbox.selection.setNodeFront(front, "console");
 
           return Promise.all([onNodeFrontSet, onInspectorUpdated]);
         }
-      }
-    });
+      });
+    }
+
+    let childComponent = ConsoleOutput({serviceContainer});
 
     let filterBar = FilterBar({
       serviceContainer: {
         attachRefToHud
       }
     });
 
     let provider = React.createElement(