Bug 1383070 - Intermittent: Uncaught exception Should load onboarding overlay, r=mossop

MozReview-Commit-ID: 6avWDMV3PAg

--HG--
extra : rebase_source : e8a9ed4d88d9fe566b5589b1bfd208ecb59a2fa4
This commit is contained in:
Fischer.json 2017-07-22 23:40:01 +08:00
parent f690118f45
commit ca0a680558
8 changed files with 119 additions and 151 deletions

View File

@ -683,8 +683,6 @@ class Onboarding {
// Show the target tour notification
this._notificationBar = this._renderNotificationBar();
this._notificationBar.addEventListener("click", this);
this._window.document.body.appendChild(this._notificationBar);
this._notificationBar.dataset.targetTourId = targetTour.id;
let notificationStrings = targetTour.getNotificationStrings(this._bundle);
let actionBtn = this._notificationBar.querySelector("#onboarding-notification-action-btn");
@ -694,6 +692,7 @@ class Onboarding {
let tourMessage = this._notificationBar.querySelector("#onboarding-notification-tour-message");
tourMessage.textContent = notificationStrings.message;
this._notificationBar.classList.add("onboarding-opened");
this._window.document.body.appendChild(this._notificationBar);
let params = [];
if (startQueueLength != queue.length) {
@ -889,6 +888,12 @@ if (Services.prefs.getBoolPref("browser.onboarding.enabled", false) &&
let window = evt.target.defaultView;
let location = window.location.href;
if (location == ABOUT_NEWTAB_URL || location == ABOUT_HOME_URL) {
// We just want to run tests as quick as possible
// so in the automation test, we don't do `requestIdleCallback`.
if (Cu.isInAutomation) {
new Onboarding(window);
return;
}
window.requestIdleCallback(() => {
new Onboarding(window);
});

View File

@ -3,6 +3,8 @@
"use strict";
requestLongerTimeout(3);
add_task(async function test_show_tour_notifications_in_order() {
resetOnboardingDefaultState();
Preferences.set("browser.onboarding.notification.max-prompt-count-per-tour", 1);
@ -11,15 +13,12 @@ add_task(async function test_show_tour_notifications_in_order() {
let tourIds = TOUR_IDs;
let tab = null;
let targetTourId = null;
let reloadPromise = null;
let expectedPrefUpdate = null;
await loopTourNotificationQueueOnceInOrder();
await loopTourNotificationQueueOnceInOrder();
expectedPrefUpdate = promisePrefUpdated("browser.onboarding.notification.finished", true);
reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await expectedPrefUpdate;
let tourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
@ -29,12 +28,9 @@ add_task(async function test_show_tour_notifications_in_order() {
async function loopTourNotificationQueueOnceInOrder() {
for (let i = 0; i < tourIds.length; ++i) {
if (tab) {
reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
} else {
tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, ABOUT_NEWTAB_URL);
tab = await openTab(ABOUT_NEWTAB_URL);
}
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
@ -48,8 +44,7 @@ add_task(async function test_open_target_tour_from_notification() {
resetOnboardingDefaultState();
skipMuteNotificationOnFirstSession();
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, ABOUT_NEWTAB_URL);
let tab = await openTab(ABOUT_NEWTAB_URL);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
let targetTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
@ -61,4 +56,3 @@ add_task(async function test_open_target_tour_from_notification() {
is(`${targetTourId}-page`, activePageId, "Should display the target tour page.");
await BrowserTestUtils.removeTab(tab);
});

View File

@ -3,6 +3,8 @@
"use strict";
requestLongerTimeout(3);
add_task(async function test_not_show_notification_for_completed_tour() {
resetOnboardingDefaultState();
skipMuteNotificationOnFirstSession();
@ -16,8 +18,7 @@ add_task(async function test_not_show_notification_for_completed_tour() {
}
}
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, ABOUT_NEWTAB_URL);
let tab = await openTab(ABOUT_NEWTAB_URL);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
let targetTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
@ -35,17 +36,14 @@ add_task(async function test_skip_notification_for_completed_tour() {
await setTourCompletedState(tourIds[1], true);
// Test show notification for the 1st tour
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, ABOUT_NEWTAB_URL);
let tab = await openTab(ABOUT_NEWTAB_URL);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
let targetTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
is(targetTourId, tourIds[0], "Should show notification for incompleted tour");
// Test skip the 2nd tour and show notification for the 3rd tour
let reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
targetTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
@ -57,15 +55,12 @@ add_task(async function test_mute_notification_on_1st_session() {
resetOnboardingDefaultState();
// Test no notifications during the mute duration on the 1st session
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, ABOUT_NEWTAB_URL);
let tab = await openTab(ABOUT_NEWTAB_URL);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
// The tour notification would be prompted on idle, so we wait idle twice here before proceeding
await waitUntilWindowIdle(tab.linkedBrowser);
await waitUntilWindowIdle(tab.linkedBrowser);
let reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await waitUntilWindowIdle(tab.linkedBrowser);
await waitUntilWindowIdle(tab.linkedBrowser);
@ -76,9 +71,7 @@ add_task(async function test_mute_notification_on_1st_session() {
let muteTime = Preferences.get("browser.onboarding.notification.mute-duration-on-first-session-ms");
let lastTime = Math.floor((Date.now() - muteTime - 1) / 1000);
Preferences.set("browser.onboarding.notification.last-time-of-changing-tour-sec", lastTime);
reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
promptCount = Preferences.get("browser.onboarding.notification.prompt-count", 0);

View File

@ -3,32 +3,28 @@
"use strict";
requestLongerTimeout(3);
add_task(async function test_move_on_to_next_notification_when_reaching_max_prompt_count() {
resetOnboardingDefaultState();
skipMuteNotificationOnFirstSession();
let maxCount = Preferences.get("browser.onboarding.notification.max-prompt-count-per-tour");
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, ABOUT_NEWTAB_URL);
let tab = await openTab(ABOUT_NEWTAB_URL);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
let previousTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
let currentTourId = null;
let reloadPromise = null;
for (let i = maxCount - 1; i > 0; --i) {
reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
currentTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
is(previousTourId, currentTourId, "Should not move on to next tour notification until reaching the max prompt count per tour");
}
reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
currentTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
@ -41,8 +37,7 @@ add_task(async function test_move_on_to_next_notification_when_reaching_max_life
resetOnboardingDefaultState();
skipMuteNotificationOnFirstSession();
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, ABOUT_NEWTAB_URL);
let tab = await openTab(ABOUT_NEWTAB_URL);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
let previousTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
@ -50,9 +45,7 @@ add_task(async function test_move_on_to_next_notification_when_reaching_max_life
let maxTime = Preferences.get("browser.onboarding.notification.max-life-time-per-tour-ms");
let lastTime = Math.floor((Date.now() - maxTime - 1) / 1000);
Preferences.set("browser.onboarding.notification.last-time-of-changing-tour-sec", lastTime);
let reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
let currentTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
@ -65,16 +58,13 @@ add_task(async function test_move_on_to_next_notification_after_interacting_with
resetOnboardingDefaultState();
skipMuteNotificationOnFirstSession();
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, ABOUT_NEWTAB_URL);
let tab = await openTab(ABOUT_NEWTAB_URL);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
let previousTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-notification-close-btn", {}, tab.linkedBrowser);
let reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
let currentTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
@ -82,9 +72,7 @@ add_task(async function test_move_on_to_next_notification_after_interacting_with
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-notification-action-btn", {}, tab.linkedBrowser);
previousTourId = currentTourId;
reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
currentTourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);

View File

@ -3,6 +3,8 @@
"use strict";
requestLongerTimeout(3);
add_task(async function test_remove_all_tour_notifications_through_close_button() {
resetOnboardingDefaultState();
skipMuteNotificationOnFirstSession();
@ -10,13 +12,10 @@ add_task(async function test_remove_all_tour_notifications_through_close_button(
let tourIds = TOUR_IDs;
let tab = null;
let targetTourId = null;
let reloadPromise = null;
await closeTourNotificationsOneByOne();
let expectedPrefUpdate = promisePrefUpdated("browser.onboarding.notification.finished", true);
reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await expectedPrefUpdate;
let tourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
@ -26,12 +25,9 @@ add_task(async function test_remove_all_tour_notifications_through_close_button(
async function closeTourNotificationsOneByOne() {
for (let i = 0; i < tourIds.length; ++i) {
if (tab) {
reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
} else {
tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, ABOUT_NEWTAB_URL);
tab = await openTab(ABOUT_NEWTAB_URL);
}
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);
@ -50,13 +46,10 @@ add_task(async function test_remove_all_tour_notifications_through_action_button
let tourIds = TOUR_IDs;
let tab = null;
let targetTourId = null;
let reloadPromise = null;
await clickTourNotificationActionButtonsOneByOne();
let expectedPrefUpdate = promisePrefUpdated("browser.onboarding.notification.finished", true);
reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await expectedPrefUpdate;
let tourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
@ -66,12 +59,9 @@ add_task(async function test_remove_all_tour_notifications_through_action_button
async function clickTourNotificationActionButtonsOneByOne() {
for (let i = 0; i < tourIds.length; ++i) {
if (tab) {
reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
await reloadPromise;
await reloadTab(tab);
} else {
tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, ABOUT_NEWTAB_URL);
tab = await openTab(ABOUT_NEWTAB_URL);
}
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await promiseTourNotificationOpened(tab.linkedBrowser);

View File

@ -3,6 +3,8 @@
"use strict";
requestLongerTimeout(2);
function assertOnboardingDestroyed(browser) {
return ContentTask.spawn(browser, {}, function() {
let expectedRemovals = [
@ -33,8 +35,7 @@ add_task(async function test_hide_onboarding_tours() {
let tourIds = TOUR_IDs;
let tabs = [];
for (let url of URLs) {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, url);
let tab = await openTab(url);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
await promiseOnboardingOverlayOpened(tab.linkedBrowser);
@ -64,8 +65,7 @@ add_task(async function test_click_action_button_to_set_tour_completed() {
let tourIds = TOUR_IDs;
let tabs = [];
for (let url of URLs) {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, url);
let tab = await openTab(url);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
await promiseOnboardingOverlayOpened(tab.linkedBrowser);
@ -86,7 +86,6 @@ add_task(async function test_click_action_button_to_set_tour_completed() {
}
});
add_task(async function test_set_right_tour_completed_style_on_overlay() {
resetOnboardingDefaultState();
@ -98,8 +97,7 @@ add_task(async function test_set_right_tour_completed_style_on_overlay() {
let tabs = [];
for (let url of URLs) {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, url);
let tab = await openTab(url);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
await promiseOnboardingOverlayOpened(tab.linkedBrowser);

View File

@ -3,17 +3,15 @@
"use strict";
requestLongerTimeout(2);
add_task(async function test_onboarding_default_new_tourset() {
resetOnboardingDefaultState();
let tabs = [];
for (let url of URLs) {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, url);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
await promiseOnboardingOverlayOpened(tab.linkedBrowser);
tabs.push(tab);
}
let tab = await openTab(ABOUT_NEWTAB_URL);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
await promiseOnboardingOverlayOpened(tab.linkedBrowser);
let doc = content && content.document;
let doms = doc.querySelectorAll(".onboarding-tour-item");
@ -22,10 +20,7 @@ add_task(async function test_onboarding_default_new_tourset() {
is(TOUR_IDs[idx], dom.id, "contain defined onboarding id");
});
for (let i = tabs.length - 1; i >= 0; --i) {
let tab = tabs[i];
await BrowserTestUtils.removeTab(tab);
}
await BrowserTestUtils.removeTab(tab);
});
add_task(async function test_onboarding_custom_new_tourset() {
@ -43,15 +38,10 @@ add_task(async function test_onboarding_custom_new_tourset() {
["browser.onboarding.newtour", "private,addons,customize"],
]});
let tabs = [];
for (let url of URLs) {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, url);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
await promiseOnboardingOverlayOpened(tab.linkedBrowser);
tabs.push(tab);
}
let tab = await openTab(ABOUT_NEWTAB_URL);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
await promiseOnboardingOverlayOpened(tab.linkedBrowser);
let doc = content && content.document;
let doms = doc.querySelectorAll(".onboarding-tour-item");
@ -60,10 +50,7 @@ add_task(async function test_onboarding_custom_new_tourset() {
is(CUSTOM_NEW_TOURs[idx], dom.id, "contain defined onboarding id");
});
for (let i = tabs.length - 1; i >= 0; --i) {
let tab = tabs[i];
await BrowserTestUtils.removeTab(tab);
}
await BrowserTestUtils.removeTab(tab);
});
add_task(async function test_onboarding_custom_update_tourset() {
@ -80,15 +67,10 @@ add_task(async function test_onboarding_custom_update_tourset() {
["browser.onboarding.updatetour", "customize,private,addons"],
]});
let tabs = [];
for (let url of URLs) {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, url);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
await promiseOnboardingOverlayOpened(tab.linkedBrowser);
tabs.push(tab);
}
let tab = await openTab(ABOUT_NEWTAB_URL);
await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
await promiseOnboardingOverlayOpened(tab.linkedBrowser);
let doc = content && content.document;
let doms = doc.querySelectorAll(".onboarding-tour-item");
@ -97,8 +79,5 @@ add_task(async function test_onboarding_custom_update_tourset() {
is(CUSTOM_UPDATE_TOURs[idx], dom.id, "contain defined onboarding id");
});
for (let i = tabs.length - 1; i >= 0; --i) {
let tab = tabs[i];
await BrowserTestUtils.removeTab(tab);
}
await BrowserTestUtils.removeTab(tab);
});

View File

@ -37,27 +37,43 @@ function setTourCompletedState(tourId, state) {
Preferences.set(`browser.onboarding.tour.${tourId}.completed`, state);
}
async function openTab(url) {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
let loadedPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
await BrowserTestUtils.loadURI(tab.linkedBrowser, url);
await loadedPromise;
return tab;
}
function reloadTab(tab) {
let reloadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
tab.linkedBrowser.reload();
return reloadPromise;
}
function promiseOnboardingOverlayLoaded(browser) {
// The onboarding overlay is init inside window.requestIdleCallback, not immediately,
// so we use check conditions here.
let condition = () => {
return ContentTask.spawn(browser, {}, function() {
return new Promise(resolve => {
let doc = content && content.document;
if (doc && doc.querySelector("#onboarding-overlay")) {
resolve(true);
return;
}
resolve(false);
function isLoaded() {
let doc = content && content.document;
if (doc.querySelector("#onboarding-overlay")) {
ok(true, "Should load onboarding overlay");
return Promise.resolve();
}
return new Promise(resolve => {
let observer = new content.MutationObserver(mutations => {
mutations.forEach(mutation => {
let overlay = Array.from(mutation.addedNodes)
.find(node => node.id == "onboarding-overlay");
if (overlay) {
observer.disconnect();
ok(true, "Should load onboarding overlay");
resolve();
}
});
});
})
};
return BrowserTestUtils.waitForCondition(
condition,
"Should load onboarding overlay",
100,
50 // Bug 1381335 increased retries, so debug builds can trigger idle in time
);
observer.observe(doc.body, { childList: true });
});
}
return ContentTask.spawn(browser, {}, isLoaded);
}
function promiseOnboardingOverlayOpened(browser) {
@ -93,24 +109,29 @@ function promisePrefUpdated(name, expectedValue) {
}
function promiseTourNotificationOpened(browser) {
let condition = () => {
return ContentTask.spawn(browser, {}, function() {
return new Promise(resolve => {
let bar = content.document.querySelector("#onboarding-notification-bar");
if (bar && bar.classList.contains("onboarding-opened")) {
resolve(true);
return;
}
resolve(false);
function isOpened() {
let doc = content && content.document;
let notification = doc.querySelector("#onboarding-notification-bar");
if (notification && notification.classList.contains("onboarding-opened")) {
ok(true, "Should open tour notification");
return Promise.resolve();
}
return new Promise(resolve => {
let observer = new content.MutationObserver(mutations => {
mutations.forEach(mutation => {
let bar = Array.from(mutation.addedNodes)
.find(node => node.id == "onboarding-notification-bar");
if (bar && bar.classList.contains("onboarding-opened")) {
observer.disconnect();
ok(true, "Should open tour notification");
resolve();
}
});
});
})
};
return BrowserTestUtils.waitForCondition(
condition,
"Should open tour notification",
100,
30
);
observer.observe(doc.body, { childList: true });
});
}
return ContentTask.spawn(browser, {}, isOpened);
}
function promiseTourNotificationClosed(browser) {