Bug 708397 - "addon-options-displayed" notification fires before XBL bindings apply; r=Unfocused, a=Unfocused

This commit is contained in:
Geoff Lankow 2011-12-13 23:32:11 +13:00
parent 929200be45
commit f8efdbf2ab
2 changed files with 29 additions and 5 deletions

View File

@ -2881,7 +2881,8 @@ var gDetailView = {
var xml = xhr.responseXML;
var settings = xml.querySelectorAll(":root > setting");
for (var i = 0, first = true; i < settings.length; i++) {
var firstSetting = null;
for (var i = 0; i < settings.length; i++) {
var setting = settings[i];
// Remove setting description, for replacement later
@ -2897,9 +2898,9 @@ var gDetailView = {
rows.appendChild(setting);
var visible = window.getComputedStyle(setting, null).getPropertyValue("display") != "none";
if (first && visible) {
if (!firstSetting && visible) {
setting.setAttribute("first-row", true);
first = false;
firstSetting = setting;
}
// Add a new row containing the description
@ -2916,7 +2917,20 @@ var gDetailView = {
}
}
Services.obs.notifyObservers(document, "addon-options-displayed", this._addon.id);
// Ensure the page has loaded and force the XBL bindings to be synchronously applied,
// then notify observers.
if (gViewController.viewPort.selectedPanel.hasAttribute("loading")) {
gDetailView.node.addEventListener("ViewChanged", function viewChangedEventListener() {
gDetailView.node.removeEventListener("ViewChanged", viewChangedEventListener, false);
if (firstSetting)
firstSetting.clientTop;
Services.obs.notifyObservers(document, "addon-options-displayed", gDetailView._addon.id);
}, false);
} else {
if (firstSetting)
firstSetting.clientTop;
Services.obs.notifyObservers(document, "addon-options-displayed", this._addon.id);
}
},
getSelectedAddon: function() {

View File

@ -16,8 +16,14 @@ MockFilePicker.reset();
var observer = {
lastData: null,
observe: function(aSubject, aTopic, aData) {
if (aTopic == "addon-options-displayed")
if (aTopic == "addon-options-displayed") {
this.lastData = aData;
// Test if the binding has applied before the observers are notified. We test the second setting here,
// because the code operates on the first setting and we want to check it applies to all.
var setting = aSubject.querySelector("rows > setting[first-row] ~ setting");
var input = gManagerWindow.document.getAnonymousElementByAttribute(setting, "class", "setting-label");
isnot(input, null, "XBL binding should be applied");
}
}
};
@ -463,11 +469,15 @@ add_test(function() {
var grid = gManagerWindow.document.getElementById("detail-grid");
var settings = grid.querySelectorAll("rows > setting");
is(settings.length, 0, "Grid should not have settings children");
observer.lastData = null;
// enable
var button = gManagerWindow.document.getElementById("detail-enable-btn");
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
is(observer.lastData, "inlinesettings1@tests.mozilla.org", "Observer notification should have fired");
settings = grid.querySelectorAll("rows > setting");
is(settings.length, SETTINGS_ROWS, "Grid should have settings children");