Bug 1307464 - Use HTMLTooltip in shader editor;r=nchevobbe draft
authorJulian Descottes <jdescottes@mozilla.com>
Thu, 26 Jul 2018 17:43:15 +0200
changeset 823390 cdb7d6eabe77816f7f6d93299f7a8440ec4ce9a4
parent 823004 e6c4fd13ad514b52b7aa38c0f507cc1438a1e893
child 823543 598eff5437e8cf2795d41bddf93d16abed1edb64
child 823545 52dd376879fa3bf92e34a46cda5f5219e5bc784f
child 823555 21cd75144a07b9dd26f8c310cde324b0471d7bdc
child 823559 decb6a1ba1f1dd554e54cf67cf9c4afb432302b5
push id117660
push userjdescottes@mozilla.com
push dateFri, 27 Jul 2018 06:44:53 +0000
reviewersnchevobbe
bugs1307464
milestone63.0a1
Bug 1307464 - Use HTMLTooltip in shader editor;r=nchevobbe Migrate the ShaderEditor to use the HTMLTooltip instead of the old XUL-only Tooltip. The HTMLTooltip doesn't provide a builtin setTextContent API, so the shadereditor is now creating the markup for the tooltip and setting it as the content. The styles have been ported to shadereditor.css and now rely on theme variables. This will allow us to move all the old tooltip code to the old debugger folder, which will be the last consumer of the widget. MozReview-Commit-ID: HVyxtf0xM4x
devtools/client/shadereditor/shadereditor.js
devtools/client/shadereditor/test/browser_se_editors-error-tooltip.js
devtools/client/themes/shadereditor.css
--- a/devtools/client/shadereditor/shadereditor.js
+++ b/devtools/client/shadereditor/shadereditor.js
@@ -4,17 +4,17 @@
 "use strict";
 
 const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
 const {SideMenuWidget} = require("devtools/client/shared/widgets/SideMenuWidget.jsm");
 const promise = require("promise");
 const defer = require("devtools/shared/defer");
 const {Task} = require("devtools/shared/task");
 const EventEmitter = require("devtools/shared/event-emitter");
-const Tooltip = require("devtools/client/shared/widgets/tooltip/Tooltip");
+const { HTMLTooltip } = require("devtools/client/shared/widgets/tooltip/HTMLTooltip");
 const Editor = require("devtools/client/sourceeditor/editor");
 const {LocalizationHelper} = require("devtools/shared/l10n");
 const {extend} = require("devtools/shared/extend");
 const {WidgetMethods, setNamedTimeout} =
   require("devtools/client/shared/widgets/view-helpers");
 
 // The panel's window global is an EventEmitter firing the following events:
 const EVENTS = {
@@ -31,16 +31,17 @@ const EVENTS = {
   // When the UI is reset from tab navigation
   UI_RESET: "ShaderEditor:UIReset",
 
   // When the editor's error markers are all removed
   EDITOR_ERROR_MARKERS_REMOVED: "ShaderEditor:EditorCleaned"
 };
 exports.EVENTS = EVENTS;
 
+const XHTML_NS = "http://www.w3.org/1999/xhtml";
 const STRINGS_URI = "devtools/client/locales/shadereditor.properties";
 const HIGHLIGHT_TINT = [1, 0, 0.25, 1]; // rgba
 const TYPING_MAX_DELAY = 500; // ms
 const SHADERS_AUTOGROW_ITEMS = 4;
 const GUTTER_ERROR_PANEL_OFFSET_X = 7; // px
 const GUTTER_ERROR_PANEL_DELAY = 100; // ms
 const DEFAULT_EDITOR_CONFIG = {
   gutters: ["errors"],
@@ -574,19 +575,31 @@ class ShadersEditorsView {
   /**
    * Event listener for the 'mouseover' event on a marker in the editor gutter.
    */
   _onMarkerMouseOver(line, node, messages) {
     if (node._markerErrorsTooltip) {
       return;
     }
 
-    const tooltip = node._markerErrorsTooltip = new Tooltip(document);
-    tooltip.defaultOffsetX = GUTTER_ERROR_PANEL_OFFSET_X;
-    tooltip.setTextContent({ messages: messages });
+    const tooltip = node._markerErrorsTooltip = new HTMLTooltip(document, {
+      type: "arrow",
+      useXulWrapper: true
+    });
+
+    const div = document.createElementNS(XHTML_NS, "div");
+    div.className = "devtools-shader-tooltip-container";
+    for (const message of messages) {
+      const messageDiv = document.createElementNS(XHTML_NS, "div");
+      messageDiv.className = "devtools-tooltip-simple-text";
+      messageDiv.textContent = message;
+      div.appendChild(messageDiv);
+    }
+    tooltip.setContent(div);
+
     tooltip.startTogglingOnHover(node, () => true, {
       toggleDelay: GUTTER_ERROR_PANEL_DELAY
     });
   }
 
   /**
    * Removes all the gutter markers and line classes from the editor.
    */
--- a/devtools/client/shadereditor/test/browser_se_editors-error-tooltip.js
+++ b/devtools/client/shadereditor/test/browser_se_editors-error-tooltip.js
@@ -27,23 +27,21 @@ async function ifWebGLSupported() {
   const editorDocument = vsEditor.container.contentDocument;
   const marker = editorDocument.querySelector(".error");
   const parsed = shadersEditorsView._errors.vs[0].messages;
   shadersEditorsView._onMarkerMouseOver(7, marker, parsed);
 
   const tooltip = marker._markerErrorsTooltip;
   ok(tooltip, "A tooltip was created successfully.");
 
-  const content = tooltip.content;
-  ok(tooltip.content,
-    "Some tooltip's content was set.");
-  ok(tooltip.content.className.includes("devtools-tooltip-simple-text-container"),
-    "The tooltip's content container was created correctly.");
+  const containerClass = ".devtools-shader-tooltip-container";
+  const container = tooltip.panel.querySelector(containerClass);
+  ok(container, "The tooltip's content container was created correctly.");
 
-  const messages = content.childNodes;
+  const messages = container.childNodes;
   is(messages.length, 3,
     "There are three messages displayed in the tooltip.");
   ok(messages[0].className.includes("devtools-tooltip-simple-text"),
     "The first message was created correctly.");
   ok(messages[1].className.includes("devtools-tooltip-simple-text"),
     "The second message was created correctly.");
   ok(messages[2].className.includes("devtools-tooltip-simple-text"),
     "The third message was created correctly.");
--- a/devtools/client/themes/shadereditor.css
+++ b/devtools/client/themes/shadereditor.css
@@ -79,16 +79,25 @@
   color: var(--theme-body-color-alt);
 }
 
 .editor-label[selected] {
   background-color: var(--theme-selection-background);
   color: var(--theme-selection-color);
 }
 
+.devtools-shader-tooltip-container .devtools-tooltip-simple-text {
+  color: var(--theme-content-color1);
+  border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.devtools-shader-tooltip-container .devtools-tooltip-simple-text:last-child {
+  border-bottom: 0;
+}
+
 /* Responsive sidebar */
 
 @media (max-width: 700px) {
   #shaders-pane {
     max-height: 60vh;
   }
 
   #editors-splitter {