Show arguments for the linked slices in the debug slice detais panel.

Change-Id: Ic566f8337547d5ec7c8ac77d275bb1b0b5b28e36
diff --git a/ui/src/frontend/chrome_slice_details_tab.ts b/ui/src/frontend/chrome_slice_details_tab.ts
index 7f83b36..5311cb2 100644
--- a/ui/src/frontend/chrome_slice_details_tab.ts
+++ b/ui/src/frontend/chrome_slice_details_tab.ts
@@ -35,7 +35,7 @@
   NewBottomTabArgs,
 } from './bottom_tab';
 import {FlowPoint, globals} from './globals';
-import {renderArguments} from './slice_args';
+import {hasArgs, renderArguments} from './slice_args';
 import {renderDetails} from './slice_details';
 import {getSlice, SliceDetails, SliceRef} from './sql/slice';
 import {
@@ -288,7 +288,10 @@
   private renderRhs(engine: EngineProxy, slice: SliceDetails): m.Children {
     const precFlows = this.renderPrecedingFlows(slice);
     const followingFlows = this.renderFollowingFlows(slice);
-    const args = renderArguments(engine, slice);
+    const args = hasArgs(slice) &&
+        m(Section,
+          {title: 'Arguments'},
+          m(Tree, renderArguments(engine, slice)));
     if (precFlows ?? followingFlows ?? args) {
       return m(
           GridLayoutColumn,
diff --git a/ui/src/frontend/slice_args.ts b/ui/src/frontend/slice_args.ts
index 70beacb..9e1798f 100644
--- a/ui/src/frontend/slice_args.ts
+++ b/ui/src/frontend/slice_args.ts
@@ -30,8 +30,7 @@
 } from '../tracks/visualised_args';
 import {Anchor} from '../widgets/anchor';
 import {MenuItem, PopupMenu2} from '../widgets/menu';
-import {Section} from '../widgets/section';
-import {Tree, TreeNode} from '../widgets/tree';
+import {TreeNode} from '../widgets/tree';
 
 import {addTab} from './bottom_tab';
 import {globals} from './globals';
@@ -40,20 +39,21 @@
 import {SqlTableTab} from './sql_table/tab';
 import {SqlTables} from './sql_table/well_known_tables';
 
-// Renders slice arguments (key/value pairs) into a Tree widget.
+// Renders slice arguments (key/value pairs) as a subtree.
 export function renderArguments(
     engine: EngineProxy, slice: SliceDetails): m.Children {
   if (slice.args && slice.args.length > 0) {
     const tree = convertArgsToTree(slice.args);
-    return m(
-        Section,
-        {title: 'Arguments'},
-        m(Tree, renderArgTreeNodes(engine, tree)));
+    return renderArgTreeNodes(engine, tree);
   } else {
     return undefined;
   }
 }
 
+export function hasArgs(slice: SliceDetails): boolean {
+  return exists(slice.args) && slice.args.length > 0;
+}
+
 function renderArgTreeNodes(
     engine: EngineProxy, args: ArgNode<Arg>[]): m.Children {
   return args.map((arg) => {
diff --git a/ui/src/tracks/chrome_scroll_jank/event_latency_details_panel.ts b/ui/src/tracks/chrome_scroll_jank/event_latency_details_panel.ts
index 5014d14..83a884c 100644
--- a/ui/src/tracks/chrome_scroll_jank/event_latency_details_panel.ts
+++ b/ui/src/tracks/chrome_scroll_jank/event_latency_details_panel.ts
@@ -171,7 +171,9 @@
           m(GridLayout,
             m(GridLayoutColumn,
               renderDetails(slice),
-              renderArguments(this.engine, slice)),
+              m(Section,
+                {title: 'Arguments'},
+                m(Tree, renderArguments(this.engine, slice)))),
             m(GridLayoutColumn,
               m(Section,
                 {title: 'Description'},
diff --git a/ui/src/tracks/debug/details_tab.ts b/ui/src/tracks/debug/details_tab.ts
index 3523f4f..5616a6b 100644
--- a/ui/src/tracks/debug/details_tab.ts
+++ b/ui/src/tracks/debug/details_tab.ts
@@ -24,6 +24,7 @@
 import {
   GenericSliceDetailsTabConfig,
 } from '../../frontend/generic_slice_details_tab';
+import {hasArgs, renderArguments} from '../../frontend/slice_args';
 import {
   getSlice,
   SliceDetails,
@@ -162,11 +163,24 @@
           left: sliceRef(this.slice, 'Slice'),
           right: '',
         },
-        renderTreeContents({
-          'Name': this.slice.name,
-          'Thread': getThreadName(this.slice.thread),
-          'Process': getProcessName(this.slice.process),
-        }));
+        m(TreeNode, {
+          left: 'Name',
+          right: this.slice.name,
+        }),
+        m(TreeNode, {
+          left: 'Thread',
+          right: getThreadName(this.slice.thread),
+        }),
+        m(TreeNode, {
+          left: 'Process',
+          right: getProcessName(this.slice.process),
+        }),
+        hasArgs(this.slice) &&
+            m(TreeNode,
+              {
+                left: 'Args',
+              },
+              renderArguments(this.engine, this.slice)));
   }