Bug 1284259 - store eventEditors map on EventTooltip instance to fix destroy failures;r=ochameau
MozReview-Commit-ID: XbahMTzqUA
--- a/devtools/client/inspector/markup/test/helper_events_test_runner.js
+++ b/devtools/client/inspector/markup/test/helper_events_test_runner.js
@@ -97,15 +97,15 @@ function* checkEventsForNode(test, inspe
}
// Make sure the header is not hidden by scrollbars before clicking.
header.scrollIntoView();
EventUtils.synthesizeMouseAtCenter(header, {}, type.ownerGlobal);
yield tooltip.once("event-tooltip-ready");
- let editor = tooltip.eventEditors.get(contentBox).editor;
+ let editor = tooltip.eventTooltip._eventEditors.get(contentBox).editor;
is(editor.getText(), expected[i].handler,
"handler matches for " + cssSelector);
}
tooltip.hide();
}
--- a/devtools/client/shared/widgets/tooltip/EventTooltipHelper.js
+++ b/devtools/client/shared/widgets/tooltip/EventTooltipHelper.js
@@ -37,17 +37,20 @@ function setEventTooltip(tooltip, eventL
let eventTooltip = new EventTooltip(tooltip, eventListenerInfos, toolbox);
eventTooltip.init();
}
function EventTooltip(tooltip, eventListenerInfos, toolbox) {
this._tooltip = tooltip;
this._eventListenerInfos = eventListenerInfos;
this._toolbox = toolbox;
- this._tooltip.eventEditors = new WeakMap();
+ this._eventEditors = new WeakMap();
+
+ // Used in tests: add a reference to the EventTooltip instance on the HTMLTooltip.
+ this._tooltip.eventTooltip = this;
this._headerClicked = this._headerClicked.bind(this);
this._debugClicked = this._debugClicked.bind(this);
this.destroy = this.destroy.bind(this);
}
EventTooltip.prototype = {
init: function () {
@@ -140,17 +143,17 @@ EventTooltip.prototype = {
dom0.textContent = level;
dom0.setAttribute("title", level);
attributesBox.appendChild(dom0);
}
// Content
let content = doc.createElementNS(XHTML_NS, "div");
let editor = new Editor(config);
- this._tooltip.eventEditors.set(content, {
+ this._eventEditors.set(content, {
editor: editor,
handler: listener.handler,
searchString: listener.searchString,
uri: listener.origin,
dom0: listener.DOM0,
appended: false
});
@@ -187,32 +190,32 @@ EventTooltip.prototype = {
for (let node of contentNodes) {
if (node !== content) {
node.removeAttribute("open");
}
}
content.setAttribute("open", "");
- let eventEditors = this._tooltip.eventEditors.get(content);
+ let eventEditor = this._eventEditors.get(content);
- if (eventEditors.appended) {
+ if (eventEditor.appended) {
return;
}
- let {editor, handler} = eventEditors;
+ let {editor, handler} = eventEditor;
let iframe = doc.createElementNS(XHTML_NS, "iframe");
iframe.setAttribute("style", "width: 100%; height: 100%; border-style: none;");
editor.appendTo(content, iframe).then(() => {
let tidied = beautify.js(handler, { "indent_size": 2 });
editor.setText(tidied);
- eventEditors.appended = true;
+ eventEditor.appended = true;
let container = header.parentElement.getBoundingClientRect();
if (header.getBoundingClientRect().top < container.top) {
header.scrollIntoView(true);
} else if (content.getBoundingClientRect().bottom > container.bottom) {
content.scrollIntoView(false);
}
@@ -220,17 +223,17 @@ EventTooltip.prototype = {
});
}
},
_debugClicked: function (event) {
let header = event.currentTarget;
let content = header.nextElementSibling;
- let {uri, searchString, dom0} = this._tooltip.eventEditors.get(content);
+ let {uri, searchString, dom0} = this._eventEditors.get(content);
if (uri && uri !== "?") {
// Save a copy of toolbox as it will be set to null when we hide the tooltip.
let toolbox = this._toolbox;
this._tooltip.hide();
uri = uri.replace(/"/g, "");
@@ -285,21 +288,22 @@ EventTooltip.prototype = {
destroy: function () {
if (this._tooltip) {
this._tooltip.off("hidden", this.destroy);
let boxes = this.container.querySelectorAll(".event-tooltip-content-box");
for (let box of boxes) {
- let {editor} = this._tooltip.eventEditors.get(box);
+ let {editor} = this._eventEditors.get(box);
editor.destroy();
}
- this._tooltip.eventEditors = null;
+ this._eventEditors = null;
+ this._tooltip.eventTooltip = null;
}
let headerNodes = this.container.querySelectorAll(".event-header");
for (let node of headerNodes) {
node.removeEventListener("click", this._headerClicked);
}