Bug 1384511 - Display the correct histograms in about:telemetry r?chutten draft
authorflyingrub <flyinggrub@gmail.com>
Fri, 28 Jul 2017 15:42:19 +0200
changeset 617522 cf3e6767ab040ece1d5d8b541422f06b36052e13
parent 617246 5845151f1a2cd00957fdd48e204542ccbdfaba1e
child 639833 7753e7d7bdcfff25770a94e007361b24914e2d04
push id71070
push userbmo:flyinggrub@gmail.com
push dateFri, 28 Jul 2017 15:24:48 +0000
reviewerschutten
bugs1384511
milestone56.0a1
Bug 1384511 - Display the correct histograms in about:telemetry r?chutten Fix "has-data" for all section that uses the process select. Display no histograms when the current process hasn't any data and not the parent ones. MozReview-Commit-ID: 4tY1C2aNR6J
toolkit/content/aboutTelemetry.js
--- a/toolkit/content/aboutTelemetry.js
+++ b/toolkit/content/aboutTelemetry.js
@@ -1705,29 +1705,31 @@ var Scalars = {
     let selectedProcess = processesSelect.selectedOptions.item(0).getAttribute("value");
 
     if (!aPayload.processes ||
         !selectedProcess ||
         !(selectedProcess in aPayload.processes)) {
       return;
     }
 
-    let scalars = aPayload.processes[selectedProcess].scalars;
-    const hasData = scalars && Object.keys(scalars).length > 0;
-    setHasData("scalars-section", hasData || processesSelect.options.length);
-    if (!hasData) {
-      return;
+    let scalars = aPayload.processes[selectedProcess].scalars || {};
+    let hasData = Array.from(processesSelect.options).some((option) => {
+      let value = option.getAttribute("value");
+      let sclrs = aPayload.processes[value].scalars;
+      return sclrs && Object.keys(sclrs).length > 0;
+    });
+    setHasData("scalars-section", hasData);
+    if (Object.keys(scalars).length > 0) {
+      const headings = [
+        "namesHeader",
+        "valuesHeader",
+      ].map(h => bundle.GetStringFromName(h));
+      const table = GenericTable.render(explodeObject(scalars), headings);
+      scalarsSection.appendChild(table);
     }
-
-    const headings = [
-      "namesHeader",
-      "valuesHeader",
-    ].map(h => bundle.GetStringFromName(h));
-    const table = GenericTable.render(explodeObject(scalars), headings);
-    scalarsSection.appendChild(table);
   },
 };
 
 var KeyedScalars = {
   /**
    * Render the keyed scalar data - if present - from the payload in a simple key-value table.
    * @param aPayload A payload object to render the data from.
    */
@@ -1739,20 +1741,24 @@ var KeyedScalars = {
     let selectedProcess = processesSelect.selectedOptions.item(0).getAttribute("value");
 
     if (!aPayload.processes ||
         !selectedProcess ||
         !(selectedProcess in aPayload.processes)) {
       return;
     }
 
-    let keyedScalars = aPayload.processes[selectedProcess].keyedScalars;
-    const hasData = keyedScalars && Object.keys(keyedScalars).length > 0;
-    setHasData("keyed-scalars-section", hasData || processesSelect.options.length);
-    if (!hasData) {
+    let keyedScalars = aPayload.processes[selectedProcess].keyedScalars || {};
+    let hasData = Array.from(processesSelect.options).some((option) => {
+      let value = option.getAttribute("value");
+      let keyedS = aPayload.processes[value].keyedScalars;
+      return keyedS && Object.keys(keyedS).length > 0;
+    });
+    setHasData("keyed-scalars-section", hasData);
+    if (!Object.keys(keyedScalars).length > 0) {
       return;
     }
 
     const headings = [
       "namesHeader",
       "valuesHeader",
     ].map(h => bundle.GetStringFromName(h));
     for (let scalar in keyedScalars) {
@@ -1775,47 +1781,45 @@ var Events = {
   /**
    * Render the event data - if present - from the payload in a simple table.
    * @param aPayload A payload object to render the data from.
    */
   render(aPayload) {
     let eventsSection = document.getElementById("events");
     removeAllChildNodes(eventsSection);
 
-    if (!aPayload.processes || !aPayload.processes.parent) {
-      return;
-    }
-
     let processesSelect = document.getElementById("processes");
     let selectedProcess = processesSelect.selectedOptions.item(0).getAttribute("value");
 
     if (!aPayload.processes ||
         !selectedProcess ||
         !(selectedProcess in aPayload.processes)) {
       return;
     }
 
-    let events = aPayload.processes[selectedProcess].events;
-    const hasData = events && Object.keys(events).length > 0;
+    let events = aPayload.processes[selectedProcess].events || {};
+    let hasData = Array.from(processesSelect.options).some((option) => {
+      let value = option.getAttribute("value");
+      let evts = aPayload.processes[value].events;
+      return evts && Object.keys(evts).length > 0;
+    });
     setHasData("events-section", hasData);
-    if (!hasData) {
-      return;
-    }
+    if (Object.keys(events).length > 0) {
+      const headings = [
+        "timestampHeader",
+        "categoryHeader",
+        "methodHeader",
+        "objectHeader",
+        "valuesHeader",
+        "extraHeader",
+      ].map(h => bundle.GetStringFromName(h));
 
-    const headings = [
-      "timestampHeader",
-      "categoryHeader",
-      "methodHeader",
-      "objectHeader",
-      "valuesHeader",
-      "extraHeader",
-    ].map(h => bundle.GetStringFromName(h));
-
-    const table = GenericTable.render(events, headings);
-    eventsSection.appendChild(table);
+      const table = GenericTable.render(events, headings);
+      eventsSection.appendChild(table);
+    }
   },
 };
 
 /**
  * Helper function for showing either the toggle element or "No data collected" message for a section
  *
  * @param aSectionID ID of the section element that needs to be changed
  * @param aHasData true (default) indicates that toggle should be displayed
@@ -2076,74 +2080,75 @@ var LateWritesSingleton = {
   },
 };
 
 var HistogramSection = {
   render(aPayload) {
     let hgramDiv = document.getElementById("histograms");
     removeAllChildNodes(hgramDiv);
 
-    let histograms = aPayload.histograms;
-
+    let histograms = {};
     let hgramsSelect = document.getElementById("processes");
     let hgramsOption = hgramsSelect.selectedOptions.item(0);
     let hgramsProcess = hgramsOption.getAttribute("value");
-    // "parent" histograms/keyedHistograms aren't under "parent". Fix that up.
+
     if (hgramsProcess === "parent") {
-      hgramsProcess = "";
-    }
-    if (hgramsProcess &&
-        "processes" in aPayload &&
-        hgramsProcess in aPayload.processes) {
+      histograms = aPayload.histograms;
+    } else if ("processes" in aPayload && hgramsProcess in aPayload.processes) {
       histograms = aPayload.processes[hgramsProcess].histograms;
     }
 
-    let hasData = Object.keys(histograms).length > 0;
-    setHasData("histograms-section", hasData || hgramsSelect.options.length);
+    let hasData = Array.from(hgramsSelect.options).some((option) => {
+      if (option == "parent") {
+        return Object.keys(aPayload.histograms).length > 0;
+      }
+      let value = option.getAttribute("value");
+      let histos = aPayload.processes[value].histograms;
+      return histos && Object.keys(histos).length > 0;
+    });
+    setHasData("histograms-section", hasData);
 
-    if (hasData) {
+    if (Object.keys(histograms).length > 0) {
       for (let [name, hgram] of Object.entries(histograms)) {
         Histogram.render(hgramDiv, name, hgram, {unpacked: true});
       }
-
-      setHasData("histograms-section", true);
     }
   },
 }
 
 var KeyedHistogramSection = {
   render(aPayload) {
     let keyedDiv = document.getElementById("keyed-histograms");
     removeAllChildNodes(keyedDiv);
 
-    let keyedHistograms = aPayload.keyedHistograms;
-
+    let keyedHistograms = {};
     let keyedHgramsSelect = document.getElementById("processes");
     let keyedHgramsOption = keyedHgramsSelect.selectedOptions.item(0);
     let keyedHgramsProcess = keyedHgramsOption.getAttribute("value");
-    // "parent" histograms/keyedHistograms aren't under "parent". Fix that up.
     if (keyedHgramsProcess === "parent") {
-      keyedHgramsProcess = "";
-    }
-    if (keyedHgramsProcess &&
-        "processes" in aPayload &&
-        keyedHgramsProcess in aPayload.processes) {
+      keyedHistograms = aPayload.keyedHistograms;
+    } else if ("processes" in aPayload && keyedHgramsProcess in aPayload.processes) {
       keyedHistograms = aPayload.processes[keyedHgramsProcess].keyedHistograms;
     }
 
-    setHasData("keyed-histograms-section", keyedHgramsSelect.options.length);
-    if (keyedHistograms) {
-      let hasData = false;
+    let hasData = Array.from(keyedHgramsSelect.options).some((option) => {
+      if (option == "parent") {
+        return Object.keys(aPayload.keyedHistograms).length > 0;
+      }
+      let value = option.getAttribute("value");
+      let keyedHistos = aPayload.processes[value].keyedHistograms;
+      return keyedHistos && Object.keys(keyedHistos).length > 0;
+    });
+    setHasData("keyed-histograms-section", hasData);
+    if (Object.keys(keyedHistograms).length > 0) {
       for (let [id, keyed] of Object.entries(keyedHistograms)) {
         if (Object.keys(keyed).length > 0) {
-          hasData = true;
           KeyedHistogram.render(keyedDiv, id, keyed, {unpacked: true});
         }
       }
-      setHasData("keyed-histograms-section", hasData || keyedHgramsSelect.options.length);
     }
   },
 }
 
 var SessionInformation = {
   render(aPayload) {
     let infoSection = document.getElementById("session-info");
     removeAllChildNodes(infoSection);