Bug 1351266 - Test preview and font tooltips by faking mouse events. r=jdescottes draft
authorAlexandre Poirot <poirot.alex@gmail.com>
Tue, 28 Mar 2017 15:51:08 +0200
changeset 564211 b927c03e8dc2f3bcff89c044e7ccfc93197b6b51
parent 564098 bb38d935d699e0529f9e0bb35578d381026415c4
child 624711 91f5fcde9b8fc052d9e5a7f38709c2a96517b0c9
push id54570
push userbmo:poirot.alex@gmail.com
push dateTue, 18 Apr 2017 13:05:06 +0000
reviewersjdescottes
bugs1351266
milestone55.0a1
Bug 1351266 - Test preview and font tooltips by faking mouse events. r=jdescottes MozReview-Commit-ID: LdaTXmo9Eb6
devtools/client/inspector/markup/test/browser_markup_dragdrop_tooltip.js
devtools/client/inspector/markup/test/browser_markup_image_tooltip.js
devtools/client/inspector/markup/test/browser_markup_image_tooltip_mutations.js
devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_01.js
devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_02.js
devtools/client/inspector/rules/test/browser_rules_colorpicker-hides-on-tooltip.js
devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js
devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js
devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js
devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js
devtools/client/inspector/shared/test/browser_styleinspector_tooltip-size.js
devtools/client/inspector/test/head.js
--- a/devtools/client/inspector/markup/test/browser_markup_dragdrop_tooltip.js
+++ b/devtools/client/inspector/markup/test/browser_markup_dragdrop_tooltip.js
@@ -11,25 +11,25 @@ add_task(function* () {
   let {inspector} = yield openInspectorForURL(TEST_URL);
   let {markup} = inspector;
 
   info("Get the tooltip target element for the image's src attribute");
   let img = yield getContainerForSelector("img", inspector);
   let target = img.editor.getAttributeElement("src").querySelector(".link");
 
   info("Check that the src attribute of the image is a valid tooltip target");
-  let isValid = yield isHoverTooltipTarget(markup.imagePreviewTooltip, target);
-  ok(isValid, "The element is a valid tooltip target");
+  yield assertTooltipShownOnHover(markup.imagePreviewTooltip, target);
+  yield assertTooltipHiddenOnMouseOut(markup.imagePreviewTooltip, target);
 
   info("Start dragging the test div");
   yield simulateNodeDrag(inspector, "div");
 
   info("Now check that the src attribute of the image isn't a valid target");
-  isValid = yield isHoverTooltipTarget(markup.imagePreviewTooltip, target);
+  let isValid = yield markup.imagePreviewTooltip._toggle.isValidHoverTarget(target);
   ok(!isValid, "The element is not a valid tooltip target");
 
   info("Stop dragging the test div");
   yield simulateNodeDrop(inspector, "div");
 
   info("Check again the src attribute of the image");
-  isValid = yield isHoverTooltipTarget(markup.imagePreviewTooltip, target);
-  ok(isValid, "The element is a valid tooltip target");
+  yield assertTooltipShownOnHover(markup.imagePreviewTooltip, target);
+  yield assertTooltipHiddenOnMouseOut(markup.imagePreviewTooltip, target);
 });
--- a/devtools/client/inspector/markup/test/browser_markup_image_tooltip.js
+++ b/devtools/client/inspector/markup/test/browser_markup_image_tooltip.js
@@ -18,40 +18,35 @@ add_task(function* () {
   yield addTab(URL_ROOT + "doc_markup_image_and_canvas_2.html");
   let {inspector} = yield openInspector();
 
   info("Selecting the first <img> tag");
   yield selectNode("img", inspector);
 
   for (let testNode of TEST_NODES) {
     let target = yield getImageTooltipTarget(testNode, inspector);
-    yield assertTooltipShownOn(target, inspector);
+    yield assertTooltipShownOnHover(inspector.markup.imagePreviewTooltip, target);
     checkImageTooltip(testNode, inspector);
+    yield assertTooltipHiddenOnMouseOut(inspector.markup.imagePreviewTooltip, target);
   }
 });
 
 function* getImageTooltipTarget({selector}, inspector) {
   let nodeFront = yield getNodeFront(selector, inspector);
   let isImg = nodeFront.tagName.toLowerCase() === "img";
 
   let container = getContainerForNodeFront(nodeFront, inspector);
 
   let target = container.editor.tag;
   if (isImg) {
     target = container.editor.getAttributeElement("src").querySelector(".link");
   }
   return target;
 }
 
-function* assertTooltipShownOn(element, {markup}) {
-  info("Is the element a valid hover target");
-  let isValid = yield isHoverTooltipTarget(markup.imagePreviewTooltip, element);
-  ok(isValid, "The element is a valid hover target for the image tooltip");
-}
-
 function checkImageTooltip({selector, size}, {markup}) {
   let panel = markup.imagePreviewTooltip.panel;
   let images = panel.getElementsByTagName("img");
   is(images.length, 1, "Tooltip for [" + selector + "] contains an image");
 
   let label = panel.querySelector(".devtools-tooltip-caption");
   is(label.textContent, size,
      "Tooltip label for [" + selector + "] displays the right image size");
--- a/devtools/client/inspector/markup/test/browser_markup_image_tooltip_mutations.js
+++ b/devtools/client/inspector/markup/test/browser_markup_image_tooltip_mutations.js
@@ -32,31 +32,35 @@ add_task(function* () {
   let container = getContainerForNodeFront(img, inspector);
   ok(container, "Found markup container for the image.");
 
   let target = container.editor.getAttributeElement("src")
                                .querySelector(".link");
   ok(target, "Found the src attribute in the markup view.");
 
   info("Showing tooltip on the src link.");
-  yield isHoverTooltipTarget(inspector.markup.imagePreviewTooltip, target);
+  yield assertTooltipShownOnHover(inspector.markup.imagePreviewTooltip, target);
 
   checkImageTooltip(INITIAL_SRC_SIZE, inspector);
 
+  yield assertTooltipHiddenOnMouseOut(inspector.markup.imagePreviewTooltip, target);
+
   info("Updating the image src.");
   yield updateImageSrc(img, UPDATED_SRC, inspector);
 
   target = container.editor.getAttributeElement("src").querySelector(".link");
   ok(target, "Found the src attribute in the markup view after mutation.");
 
   info("Showing tooltip on the src link.");
-  yield isHoverTooltipTarget(inspector.markup.imagePreviewTooltip, target);
+  yield assertTooltipShownOnHover(inspector.markup.imagePreviewTooltip, target);
 
   info("Checking that the new image was shown.");
   checkImageTooltip(UPDATED_SRC_SIZE, inspector);
+
+  yield assertTooltipHiddenOnMouseOut(inspector.markup.imagePreviewTooltip, target);
 });
 
 /**
  * Updates the src attribute of the image. Return a Promise.
  */
 function updateImageSrc(img, newSrc, inspector) {
   let onMutated = inspector.once("markupmutation");
   let onModified = img.modifyAttributes([{
--- a/devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_01.js
+++ b/devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_01.js
@@ -22,21 +22,19 @@ add_task(function* () {
   let {view} = yield openRuleView();
   let value = getRuleViewProperty(view, "body", "background").valueSpan;
   let swatch = value.querySelectorAll(".ruleview-colorswatch")[0];
   let url = value.querySelector(".theme-link");
   yield testImageTooltipAfterColorChange(swatch, url, view);
 });
 
 function* testImageTooltipAfterColorChange(swatch, url, ruleView) {
-  let previewTooltip = ruleView.tooltips.getTooltip("previewTooltip");
   info("First, verify that the image preview tooltip works");
-  let anchor = yield isHoverTooltipTarget(previewTooltip, url);
-  ok(anchor, "The image preview tooltip is shown on the url span");
-  is(anchor, url, "The anchor returned by the showOnHover callback is correct");
+  let previewTooltip = yield assertShowPreviewTooltip(ruleView, url);
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, url);
 
   info("Open the color picker tooltip and change the color");
   let picker = ruleView.tooltips.getTooltip("colorPicker");
   let onColorPickerReady = picker.once("ready");
   swatch.click();
   yield onColorPickerReady;
 
   yield simulateColorPickerChange(ruleView, picker, [0, 0, 0, 1], {
@@ -52,12 +50,12 @@ function* testImageTooltipAfterColorChan
   yield onHidden;
   yield onModifications;
 
   info("Verify again that the image preview tooltip works");
   // After a color change, the property is re-populated, we need to get the new
   // dom node
   url = getRuleViewProperty(ruleView, "body", "background").valueSpan
     .querySelector(".theme-link");
-  anchor = yield isHoverTooltipTarget(previewTooltip, url);
-  ok(anchor, "The image preview tooltip is shown on the url span");
-  is(anchor, url, "The anchor returned by the showOnHover callback is correct");
+  previewTooltip = yield assertShowPreviewTooltip(ruleView, url);
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, url);
 }
--- a/devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_02.js
+++ b/devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_02.js
@@ -48,20 +48,18 @@ function* testColorChangeIsntRevertedWhe
   let onHidden = picker.tooltip.once("hidden");
   focusAndSendKey(spectrum.element.ownerDocument.defaultView, "RETURN");
   yield onHidden;
   yield onModifications;
 
   info("Open the image preview tooltip");
   let value = getRuleViewProperty(ruleView, "body", "background").valueSpan;
   let url = value.querySelector(".theme-link");
-  let previewTooltip = ruleView.tooltips.getTooltip("previewTooltip");
-  let onShown = previewTooltip.once("shown");
-  let anchor = yield isHoverTooltipTarget(previewTooltip, url);
-  previewTooltip.show(anchor);
-  yield onShown;
+  let previewTooltip = yield assertShowPreviewTooltip(ruleView, url);
 
   info("Image tooltip is shown, verify that the swatch is still correct");
   swatch = value.querySelector(".ruleview-colorswatch");
   is(swatch.style.backgroundColor, "black",
     "The swatch's color is correct");
   is(swatch.nextSibling.textContent, "black", "The color name is correct");
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, url);
 }
--- a/devtools/client/inspector/rules/test/browser_rules_colorpicker-hides-on-tooltip.js
+++ b/devtools/client/inspector/rules/test/browser_rules_colorpicker-hides-on-tooltip.js
@@ -33,14 +33,16 @@ add_task(function* () {
   let onColorPickerReady = colorPicker.once("ready");
   swatch.click();
   yield onColorPickerReady;
 
   info("Now showing the image preview tooltip to hide the color picker");
   let onHidden = colorPicker.tooltip.once("hidden");
   // Hiding the color picker refreshes the value.
   let onRuleViewChanged = view.once("ruleview-changed");
-  yield assertHoverTooltipOn(view.tooltips.getTooltip("previewTooltip"), uriSpan);
+  let previewTooltip = yield assertShowPreviewTooltip(view, uriSpan);
   yield onHidden;
   yield onRuleViewChanged;
 
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, uriSpan);
+
   ok(true, "The color picker closed when the image preview tooltip appeared");
 });
--- a/devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js
+++ b/devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js
@@ -47,79 +47,77 @@ add_task(function* () {
   yield onComputedViewReady;
 
   info("Testing that the background-image computed style has a tooltip too");
   yield testComputedView(view);
 });
 
 function* testBodyRuleView(view) {
   info("Testing tooltips in the rule view");
-  let panel = view.tooltips.getTooltip("previewTooltip").panel;
-
-  // Check that the rule view has a tooltip and that a XUL panel has
-  // been created
-  ok(view.tooltips.getTooltip("previewTooltip"), "Tooltip instance exists");
-  ok(panel, "XUL panel exists");
 
   // Get the background-image property inside the rule view
   let {valueSpan} = getRuleViewProperty(view, "body", "background-image");
   let uriSpan = valueSpan.querySelector(".theme-link");
 
-  yield assertHoverTooltipOn(view.tooltips.getTooltip("previewTooltip"), uriSpan);
+  let previewTooltip = yield assertShowPreviewTooltip(view, uriSpan);
 
-  let images = panel.getElementsByTagName("img");
+  let images = previewTooltip.panel.getElementsByTagName("img");
   is(images.length, 1, "Tooltip contains an image");
   ok(images[0].getAttribute("src")
     .indexOf("iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHe") !== -1,
     "The image URL seems fine");
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, uriSpan);
 }
 
 function* testDivRuleView(view) {
-  let panel = view.tooltips.getTooltip("previewTooltip").panel;
-
   // Get the background property inside the rule view
   let {valueSpan} = getRuleViewProperty(view, ".test-element", "background");
   let uriSpan = valueSpan.querySelector(".theme-link");
 
-  yield assertHoverTooltipOn(view.tooltips.getTooltip("previewTooltip"), uriSpan);
+  let previewTooltip = yield assertShowPreviewTooltip(view, uriSpan);
 
-  let images = panel.getElementsByTagName("img");
+  let images = previewTooltip.panel.getElementsByTagName("img");
   is(images.length, 1, "Tooltip contains an image");
   ok(images[0].getAttribute("src").startsWith("data:"),
     "Tooltip contains a data-uri image as expected");
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, uriSpan);
 }
 
 function* testTooltipAppearsEvenInEditMode(view) {
   info("Switching to edit mode in the rule view");
   let editor = yield turnToEditMode(view);
 
   info("Now trying to show the preview tooltip");
   let {valueSpan} = getRuleViewProperty(view, ".test-element", "background");
   let uriSpan = valueSpan.querySelector(".theme-link");
-  yield assertHoverTooltipOn(view.tooltips.getTooltip("previewTooltip"), uriSpan);
+
+  let previewTooltip = yield assertShowPreviewTooltip(view, uriSpan);
 
   is(view.styleDocument.activeElement, editor.input,
     "Tooltip was shown in edit mode, and inplace-editor still focused");
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, uriSpan);
 }
 
 function turnToEditMode(ruleView) {
   let brace = ruleView.styleDocument.querySelector(".ruleview-ruleclose");
   return focusEditableField(ruleView, brace);
 }
 
 function* testComputedView(view) {
-  let tooltip = view.tooltips.getTooltip("previewTooltip");
-  ok(tooltip, "The computed-view has a tooltip defined");
-
-  let panel = tooltip.panel;
-  ok(panel, "The computed-view tooltip has a XUL panel");
-
   let {valueSpan} = getComputedViewProperty(view, "background-image");
   let uriSpan = valueSpan.querySelector(".theme-link");
 
-  yield assertHoverTooltipOn(view.tooltips.getTooltip("previewTooltip"), uriSpan);
+  // Scroll to ensure the line is visible as we see the box model by default
+  valueSpan.scrollIntoView();
 
-  let images = panel.getElementsByTagName("img");
+  let previewTooltip = yield assertShowPreviewTooltip(view, uriSpan);
+
+  let images = previewTooltip.panel.getElementsByTagName("img");
   is(images.length, 1, "Tooltip contains an image");
 
   ok(images[0].getAttribute("src").startsWith("data:"),
     "Tooltip contains a data-uri in the computed-view too");
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, uriSpan);
 }
--- a/devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js
+++ b/devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js
@@ -44,45 +44,49 @@ function* testRuleView(ruleView, nodeFro
   ok(tooltip, "Tooltip instance exists");
   ok(panel, "XUL panel exists");
 
   // Get the font family property inside the rule view
   let {valueSpan} = getRuleViewProperty(ruleView, "#testElement",
     "font-family");
 
   // And verify that the tooltip gets shown on this property
-  yield assertHoverTooltipOn(tooltip, valueSpan);
+  let previewTooltip = yield assertShowPreviewTooltip(ruleView, valueSpan);
 
   let images = panel.getElementsByTagName("img");
   is(images.length, 1, "Tooltip contains an image");
   ok(images[0].getAttribute("src").startsWith("data:"),
     "Tooltip contains a data-uri image as expected");
 
   let dataURL = yield getFontFamilyDataURL(valueSpan.textContent, nodeFront);
   is(images[0].getAttribute("src"), dataURL,
     "Tooltip contains the correct data-uri image");
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, valueSpan);
 }
 
 function* testComputedView(computedView, nodeFront) {
   info("Testing font-family tooltips in the computed view");
 
   let tooltip = computedView.tooltips.getTooltip("previewTooltip");
   let panel = tooltip.panel;
   let {valueSpan} = getComputedViewProperty(computedView, "font-family");
 
-  yield assertHoverTooltipOn(tooltip, valueSpan);
+  let previewTooltip = yield assertShowPreviewTooltip(computedView, valueSpan);
 
   let images = panel.getElementsByTagName("img");
   is(images.length, 1, "Tooltip contains an image");
   ok(images[0].getAttribute("src").startsWith("data:"),
     "Tooltip contains a data-uri image as expected");
 
   let dataURL = yield getFontFamilyDataURL(valueSpan.textContent, nodeFront);
   is(images[0].getAttribute("src"), dataURL,
     "Tooltip contains the correct data-uri image");
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, valueSpan);
 }
 
 function* testExpandedComputedViewProperty(computedView, nodeFront) {
   info("Testing font-family tooltips in expanded properties of the " +
     "computed view");
 
   info("Expanding the font-family property to reveal matched selectors");
   let propertyView = getPropertyView(computedView, "font-family");
@@ -90,26 +94,28 @@ function* testExpandedComputedViewProper
   yield propertyView.refreshMatchedSelectors();
 
   let valueSpan = propertyView.matchedSelectorsContainer
     .querySelector(".bestmatch .other-property-value");
 
   let tooltip = computedView.tooltips.getTooltip("previewTooltip");
   let panel = tooltip.panel;
 
-  yield assertHoverTooltipOn(tooltip, valueSpan);
+  let previewTooltip = yield assertShowPreviewTooltip(computedView, valueSpan);
 
   let images = panel.getElementsByTagName("img");
   is(images.length, 1, "Tooltip contains an image");
   ok(images[0].getAttribute("src").startsWith("data:"),
     "Tooltip contains a data-uri image as expected");
 
   let dataURL = yield getFontFamilyDataURL(valueSpan.textContent, nodeFront);
   is(images[0].getAttribute("src"), dataURL,
     "Tooltip contains the correct data-uri image");
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, valueSpan);
 }
 
 function getPropertyView(computedView, name) {
   let propertyView = null;
   computedView.propertyViews.some(function (view) {
     if (view.name == name) {
       propertyView = view;
       return true;
--- a/devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js
+++ b/devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js
@@ -46,18 +46,22 @@ function* testComputedViewUrls(inspector
 function* performChecks(view, propertyValue) {
   function checkTooltip(panel, imageSrc) {
     let images = panel.getElementsByTagName("img");
     is(images.length, 1, "Tooltip contains an image");
     is(images[0].getAttribute("src"), imageSrc, "The image URL is correct");
   }
 
   let links = propertyValue.querySelectorAll(".theme-link");
-  let panel = view.tooltips.getTooltip("previewTooltip").panel;
 
   info("Checking first link tooltip");
-  yield assertHoverTooltipOn(view.tooltips.getTooltip("previewTooltip"), links[0]);
+  let previewTooltip = yield assertShowPreviewTooltip(view, links[0]);
+  let panel = view.tooltips.getTooltip("previewTooltip").panel;
   checkTooltip(panel, YELLOW_DOT);
 
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, links[0]);
+
   info("Checking second link tooltip");
-  yield assertHoverTooltipOn(view.tooltips.getTooltip("previewTooltip"), links[1]);
+  previewTooltip = yield assertShowPreviewTooltip(view, links[1]);
   checkTooltip(panel, BLUE_DOT);
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, links[1]);
 }
--- a/devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js
+++ b/devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js
@@ -40,19 +40,21 @@ function* testRuleView(ruleView, nodeFro
   let fontExpander = propertyList[1].querySelectorAll(".ruleview-expander")[0];
   fontExpander.click();
 
   let rule = getRuleViewRule(ruleView, "#testElement");
   let valueSpan = rule
     .querySelector(".ruleview-computed .ruleview-propertyvalue");
 
   // And verify that the tooltip gets shown on this property
-  yield assertHoverTooltipOn(tooltip, valueSpan);
+  let previewTooltip = yield assertShowPreviewTooltip(ruleView, valueSpan);
 
   let images = panel.getElementsByTagName("img");
   is(images.length, 1, "Tooltip contains an image");
   ok(images[0].getAttribute("src")
     .startsWith("data:"), "Tooltip contains a data-uri image as expected");
 
   let dataURL = yield getFontFamilyDataURL(valueSpan.textContent, nodeFront);
   is(images[0].getAttribute("src"), dataURL,
     "Tooltip contains the correct data-uri image");
+
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, valueSpan);
 }
--- a/devtools/client/inspector/shared/test/browser_styleinspector_tooltip-size.js
+++ b/devtools/client/inspector/shared/test/browser_styleinspector_tooltip-size.js
@@ -30,36 +30,29 @@ function* testImageDimension(ruleView) {
 
   let tooltip = ruleView.tooltips.getTooltip("previewTooltip");
   let panel = tooltip.panel;
   let {valueSpan} = getRuleViewProperty(ruleView, "div", "background");
   let uriSpan = valueSpan.querySelector(".theme-link");
 
   // Make sure there is a hover tooltip for this property, this also will fill
   // the tooltip with its content
-  yield assertHoverTooltipOn(tooltip, uriSpan);
-
-  info("Showing the tooltip");
-  let onShown = tooltip.once("shown");
-  tooltip.show(uriSpan);
-  yield onShown;
+  let previewTooltip = yield assertShowPreviewTooltip(ruleView, uriSpan);
 
   // Let's not test for a specific size, but instead let's make sure it's at
   // least as big as the image
   let imageRect = panel.querySelector("img").getBoundingClientRect();
   let panelRect = panel.getBoundingClientRect();
 
   ok(panelRect.width >= imageRect.width,
     "The panel is wide enough to show the image");
   ok(panelRect.height >= imageRect.height,
     "The panel is high enough to show the image");
 
-  let onHidden = tooltip.once("hidden");
-  tooltip.hide();
-  yield onHidden;
+  yield assertTooltipHiddenOnMouseOut(previewTooltip, uriSpan);
 }
 
 function* testPickerDimension(ruleView) {
   info("Testing color-picker tooltip dimensions");
 
   let {valueSpan} = getRuleViewProperty(ruleView, "div", "background");
   let swatch = valueSpan.querySelector(".ruleview-colorswatch");
   let cPicker = ruleView.tooltips.getTooltip("colorPicker");
--- a/devtools/client/inspector/test/head.js
+++ b/devtools/client/inspector/test/head.js
@@ -639,43 +639,93 @@ var waitForTab = Task.async(function* ()
  */
 function synthesizeKeys(input, win) {
   for (let key of input.split("")) {
     EventUtils.synthesizeKey(key, {}, win);
   }
 }
 
 /**
- * Given a tooltip object instance (see Tooltip.js), checks if it is set to
- * toggle and hover and if so, checks if the given target is a valid hover
- * target. This won't actually show the tooltip (the less we interact with XUL
- * panels during test runs, the better).
+ * Given a Tooltip instance, fake a mouse event on the `target` DOM Element
+ * and assert that the `tooltip` is correctly displayed.
  *
- * @return a promise that resolves when the answer is known
+ * @param {Tooltip} tooltip
+ *        The tooltip instance
+ * @param {DOMElement} target
+ *        The DOM Element on which a tooltip should appear
+ *
+ * @return a promise that resolves with the tooltip object
  */
-function isHoverTooltipTarget(tooltip, target) {
-  if (!tooltip._toggle._baseNode || !tooltip.panel) {
-    return promise.reject(new Error(
-      "The tooltip passed isn't set to toggle on hover or is not a tooltip"));
+function* assertTooltipShownOnHover(tooltip, target) {
+  let mouseEvent = new target.ownerDocument.defaultView.MouseEvent("mousemove", {
+    bubbles: true,
+  });
+  target.dispatchEvent(mouseEvent);
+
+  if (!tooltip.isVisible()) {
+    info("Waiting for tooltip to be shown");
+    yield tooltip.once("shown");
   }
-  return tooltip._toggle.isValidHoverTarget(target);
+
+  ok(tooltip.isVisible(), `The tooltip is visible`);
+
+  return tooltip;
 }
 
 /**
- * Same as isHoverTooltipTarget except that it will fail the test if there is no
- * tooltip defined on hover of the given element
+ * Given an inspector `view` object, fake a mouse event on the `target` DOM
+ * Element and assert that the preview tooltip  is correctly displayed.
  *
- * @return a promise
+ * @param {CssRuleView|ComputedView|...} view
+ *        The instance of an inspector panel
+ * @param {DOMElement} target
+ *        The DOM Element on which a tooltip should appear
+ *
+ * @return a promise that resolves with the tooltip object
  */
-function assertHoverTooltipOn(tooltip, element) {
-  return isHoverTooltipTarget(tooltip, element).then(() => {
-    ok(true, "A tooltip is defined on hover of the given element");
-  }, () => {
-    ok(false, "No tooltip is defined on hover of the given element");
+function* assertShowPreviewTooltip(view, target) {
+  let mouseEvent = new target.ownerDocument.defaultView.MouseEvent("mousemove", {
+    bubbles: true,
   });
+  target.dispatchEvent(mouseEvent);
+
+  let name = "previewTooltip";
+  ok(view.tooltips._instances.has(name),
+    `Tooltip '${name}' has been instanciated`);
+  let tooltip = view.tooltips.getTooltip(name);
+
+  if (!tooltip.isVisible()) {
+    info("Waiting for tooltip to be shown");
+    yield tooltip.once("shown");
+  }
+
+  ok(tooltip.isVisible(), `The tooltip '${name}' is visible`);
+
+  return tooltip;
+}
+
+/**
+ * Given a `tooltip` instance, fake a mouse event on `target` DOM element
+ * and check that the tooltip correctly disappear.
+ *
+ * @param {Tooltip} tooltip
+ *        The tooltip instance
+ * @param {DOMElement} target
+ *        The DOM Element on which a tooltip should appear
+ */
+function* assertTooltipHiddenOnMouseOut(tooltip, target) {
+  let mouseEvent = new target.ownerDocument.defaultView.MouseEvent("mouseout", {
+    bubbles: true,
+    relatedTarget: target
+  });
+  target.dispatchEvent(mouseEvent);
+
+  yield tooltip.once("hidden");
+
+  ok(!tooltip.isVisible(), "The tooltip is hidden on mouseout");
 }
 
 /**
  * Open the inspector menu and return all of it's items in a flat array
  * @param {InspectorPanel} inspector
  * @param {Object} options to pass into openMenu
  * @return An array of MenuItems
  */