Bug 1444302 - Add the close button into the split console. r?nchevobbe draft
authorMantaroh Yoshinaga <mantaroh@gmail.com>
Mon, 02 Apr 2018 16:10:53 +0900
changeset 780071 ba9528a63f34e13a4f65737e6082a99afd155cd0
parent 779997 0528a414c2a86dad0623779abde5301d37337934
push id105954
push userbmo:mantaroh@gmail.com
push dateWed, 11 Apr 2018 06:25:38 +0000
reviewersnchevobbe
bugs1444302
milestone61.0a1
Bug 1444302 - Add the close button into the split console. r?nchevobbe This patch will display the button of closing split console. The FilterBar should display this close button if target is split console. MozReview-Commit-ID: ApRAZnwZBUx
devtools/client/themes/webconsole.css
devtools/client/webconsole/components/FilterBar.js
devtools/client/webconsole/new-console-output-wrapper.js
devtools/client/webconsole/test/mochitest/browser.ini
devtools/client/webconsole/test/mochitest/browser_webconsole_split_close_button.js
--- a/devtools/client/themes/webconsole.css
+++ b/devtools/client/themes/webconsole.css
@@ -1205,8 +1205,12 @@ html[dir="rtl"] .webconsole-output-wrapp
 
 .sidebar-contents .object-inspector {
   min-width: 100%;
 }
 
 .theme-twisty {
   cursor: default;
 }
+
+#split-console-close-button::before {
+  background-image: var(--close-button-image);
+}
--- a/devtools/client/webconsole/components/FilterBar.js
+++ b/devtools/client/webconsole/components/FilterBar.js
@@ -28,16 +28,17 @@ class FilterBar extends Component {
       filter: PropTypes.object.isRequired,
       serviceContainer: PropTypes.shape({
         attachRefToHud: PropTypes.func.isRequired,
       }).isRequired,
       filterBarVisible: PropTypes.bool.isRequired,
       persistLogs: PropTypes.bool.isRequired,
       hidePersistLogsCheckbox: PropTypes.bool.isRequired,
       filteredMessagesCount: PropTypes.object.isRequired,
+      toolbox: PropTypes.object,
     };
   }
 
   static get defaultProps() {
     return {
       hidePersistLogsCheckbox: false,
     };
   }
@@ -47,16 +48,26 @@ class FilterBar extends Component {
     this.onClickMessagesClear = this.onClickMessagesClear.bind(this);
     this.onClickFilterBarToggle = this.onClickFilterBarToggle.bind(this);
     this.onClickRemoveAllFilters = this.onClickRemoveAllFilters.bind(this);
     this.onClickRemoveTextFilter = this.onClickRemoveTextFilter.bind(this);
     this.onSearchInput = this.onSearchInput.bind(this);
     this.onChangePersistToggle = this.onChangePersistToggle.bind(this);
     this.renderFiltersConfigBar = this.renderFiltersConfigBar.bind(this);
     this.renderFilteredMessagesBar = this.renderFilteredMessagesBar.bind(this);
+    this.needCloseButton = this.needCloseButton.bind(this);
+
+    this.state = {
+      needDisplayCloseButton: false,
+    };
+
+    // We need to two event in order to detect opening the webconsole panel and
+    // split webconsole panel.
+    this.props.toolbox.on("split-console", this.needCloseButton);
+    this.props.toolbox.on("select", this.needCloseButton);
   }
 
   componentDidMount() {
     this.props.serviceContainer.attachRefToHud(
       "filterBox",
       this.wrapperNode.querySelector(".text-filter")
     );
   }
@@ -76,19 +87,37 @@ class FilterBar extends Component {
 
     if (
       JSON.stringify(nextProps.filteredMessagesCount)
       !== JSON.stringify(this.props.filteredMessagesCount)
     ) {
       return true;
     }
 
+    if (nextState.needDisplayCloseButton !==
+        this.state.needDisplayCloseButton) {
+      return true;
+    }
+
     return false;
   }
 
+  componentWillUnmount() {
+    this.props.toolbox.off("split-console", this.needCloseButton);
+    this.props.toolbox.off("select", this.needCloseButton);
+  }
+
+  needCloseButton() {
+    let isSplit = this.props.toolbox &&
+        this.props.toolbox.currentToolId !== "webconsole";
+    this.setState({
+      needDisplayCloseButton: isSplit,
+    });
+  }
+
   onClickMessagesClear() {
     this.props.dispatch(actions.messagesClear());
   }
 
   onClickFilterBarToggle() {
     this.props.dispatch(actions.filterBarToggle());
   }
 
@@ -223,16 +252,17 @@ class FilterBar extends Component {
 
   render() {
     const {
       filter,
       filterBarVisible,
       persistLogs,
       filteredMessagesCount,
       hidePersistLogsCheckbox,
+      toolbox,
     } = this.props;
 
     let children = [
       dom.div({
         className: "devtools-toolbar webconsole-filterbar-primary",
         key: "primary-bar",
       },
         dom.button({
@@ -257,16 +287,25 @@ class FilterBar extends Component {
           onInput: this.onSearchInput
         }),
         !hidePersistLogsCheckbox && FilterCheckbox({
           label: l10n.getStr("webconsole.enablePersistentLogs.label"),
           title: l10n.getStr("webconsole.enablePersistentLogs.tooltip"),
           onChange: this.onChangePersistToggle,
           checked: persistLogs,
         }),
+        this.state.needDisplayCloseButton
+          ? dom.button({
+              id: "split-console-close-button",
+              className: "devtools-button",
+              onClick: () => {
+                toolbox.closeSplitConsole();
+              },
+          })
+          : null,
       )
     ];
 
     if (filteredMessagesCount.global > 0) {
       children.push(this.renderFilteredMessagesBar());
     }
 
     if (filterBarVisible) {
--- a/devtools/client/webconsole/new-console-output-wrapper.js
+++ b/devtools/client/webconsole/new-console-output-wrapper.js
@@ -203,17 +203,18 @@ NewConsoleOutputWrapper.prototype = {
         serviceContainer,
         onFirstMeaningfulPaint: resolve
       });
 
       let filterBar = FilterBar({
         hidePersistLogsCheckbox: this.jsterm.hud.isBrowserConsole,
         serviceContainer: {
           attachRefToHud
-        }
+        },
+        toolbox: this.toolbox,
       });
 
       let sideBar = SideBar({
         serviceContainer,
       });
 
       let provider = createElement(
         Provider,
--- a/devtools/client/webconsole/test/mochitest/browser.ini
+++ b/devtools/client/webconsole/test/mochitest/browser.ini
@@ -337,16 +337,17 @@ subsuite = clipboard
 [browser_webconsole_show_subresource_security_errors.js]
 [browser_webconsole_shows_reqs_from_netmonitor.js]
 [browser_webconsole_shows_reqs_in_netmonitor.js]
 [browser_webconsole_sourcemap_css.js]
 [browser_webconsole_sourcemap_error.js]
 [browser_webconsole_sourcemap_invalid.js]
 [browser_webconsole_sourcemap_nosource.js]
 [browser_webconsole_split.js]
+[browser_webconsole_split_close_button.js]
 [browser_webconsole_split_escape_key.js]
 [browser_webconsole_split_focus.js]
 [browser_webconsole_split_persist.js]
 [browser_webconsole_stacktrace_location_debugger_link.js]
 [browser_webconsole_stacktrace_location_scratchpad_link.js]
 [browser_webconsole_strict_mode_errors.js]
 [browser_webconsole_string.js]
 [browser_webconsole_time_methods.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/webconsole/test/mochitest/browser_webconsole_split_close_button.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const TEST_URI = "data:text/html;charset=utf-8,<p>Web Console test for close button of " +
+                 "split console";
+
+add_task(async function() {
+  let toolbox = await openNewTabAndToolbox(TEST_URI, "inspector");
+
+  info("Check the split console toolbar has a close button");
+
+  let onSplitConsoleReady = toolbox.once("webconsole-ready");
+  toolbox.toggleSplitConsole();
+  await onSplitConsoleReady;
+
+  let closeButton = getCloseButton(toolbox);
+
+  ok(closeButton, "The split console has close button.");
+
+  info("Close the split console by using close button");
+  let onSplitConsoleChange = toolbox.once("split-console");
+  closeButton.click();
+  await onSplitConsoleChange;
+
+  ok(!toolbox.splitConsole, "Split console is hidden.");
+});
+
+add_task(async function() {
+  let toolbox = await openNewTabAndToolbox(TEST_URI, "webconsole");
+
+  info("Check the web console panel toolbar doesn't have a close button");
+  let closeButton = getCloseButton(toolbox);
+
+  ok(!closeButton, "The web console panel doesn't have a close button.");
+});
+
+function getCloseButton(toolbox) {
+  let hud = toolbox.getPanel("webconsole").hud;
+  return hud.ui.outputNode.querySelector("#split-console-close-button");
+}