VulpesOS/gaia/apps/system/test/marionette/lib/notification.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

209 lines
5.8 KiB
JavaScript
Executable file

/* global dump */
/* jshint nonew: false */
'use strict';
var Marionette = require('marionette-client');
function NotificationTest(client, details, delay_create) {
this.client = client;
this.actions = new Marionette.Actions(client);
this.tag = details.tag;
this.title = details.title;
this.body = details.body;
this.dir = details.dir;
this.lang = details.lang;
if (delay_create !== true) {
this.create();
}
}
NotificationTest.prototype = {
Selectors: {
toaster: '#notification-toaster'
},
client: null,
tag: null,
close: function() {
var ret;
this.client.executeAsyncScript(function(notifyTag) {
var n = Notification.get({tag: notifyTag});
n.then(
function(nt) {
if (nt.length === 1) {
nt[0].close();
marionetteScriptFinished(true);
return;
}
marionetteScriptFinished(false);
},
function(nt) {
marionetteScriptFinished(false);
});
}, [this.tag], function(err, value) {
ret = value;
});
return ret;
},
dumpContainer: function() {
this.client.executeScript(function() {
dump(
document.getElementById('desktop-notifications-container').innerHTML);
});
},
create: function() {
this.client.executeScript(function(notifyTag, notifyTitle, notifyBody,
notifyDir, notifyLang) {
var details = { tag: notifyTag,
body: notifyBody};
if (notifyDir) {
details.dir = notifyDir;
}
if (notifyLang) {
details.lang = notifyLang;
}
new Notification(notifyTitle, details);
}, [this.tag, this.title, this.body, this.dir, this.lang]);
}
};
function NotificationList(client) {
this.client = client;
this.selectors = NotificationList.Selector;
this.notifications = null;
}
NotificationList.Selector = Object.freeze((function() {
var listSelector = '#desktop-notifications-container';
var itemsSelector = listSelector + ' .notification';
var allItemsSelector = '#notifications-container .notification';
var countSelector = '#notification-some';
var systemUpdateSelector = '#update-manager-container .title-container';
return {
items: itemsSelector,
allItems: allItemsSelector,
systemUpdate: systemUpdateSelector,
notificationsCount: countSelector
};
})());
NotificationList.prototype = {
_remoteGetNotificationDetails: function(selector) {
var nodes = document.querySelectorAll(selector);
var details = [];
/* jshint -W084 */
for (var node, i = 0; node = nodes[i]; i++) {
var id = node.getAttribute('data-notification-id');
var query = selector + '[data-notification-id="' + id + '"]';
details.push({
title: document.querySelector(query + ' > .title-container .title')
.innerHTML,
body: document.querySelector(query + ' > .detail .detail-content')
.innerHTML,
lang: document.querySelector(query).getAttribute('lang'),
dir: document.querySelector(query).querySelector('.title').dir,
manifestURL: node.getAttribute('data-manifest-u-r-l'),
query: query
});
}
return details;
},
// fetch the list of open notifications from system tray
refresh: function() {
this.notifications = this.client.executeScript(
this._remoteGetNotificationDetails,
[this.selectors.items]);
},
// return a list of notifications for a certain app
getForApp: function(manifestURL) {
if (!this.notifications) {
return [];
}
return this.notifications.filter(function(notification) {
return notification.manifestURL === manifestURL;
});
},
// get a count of notifications with a certain title and body
getCount: function(details) {
var list;
if (details.manifestURL) {
list = this.getForApp(details.manifestURL);
} else {
list = this.notifications;
}
var count = 0;
for (var i = 0; list && i < list.length; i++) {
var notification = list[i];
if (details.title && notification.title !== details.title) {
continue;
}
if (details.body && notification.body !== details.body) {
continue;
}
if (details.lang && notification.lang !== details.lang) {
continue;
}
if (details.dir && notification.dir !== details.dir) {
continue;
}
++count;
}
return count;
},
// perform a tap action on the notification list
tap: function(notificationDetails) {
this.client.helper.waitForElement(notificationDetails.query).tap(1, 1);
},
// make sure we have an item with given title and body
contains: function(details, shouldNot) {
this.client.waitFor((function() {
var count = this.getCount(details);
if (shouldNot) {
return 0 === count;
} else {
return 0 < count;
}
}).bind(this));
return true;
},
waitForNotificationCount: function(expected) {
var count;
this.client.waitFor(function() {
count = this.client.executeScript(
this._getNotificationsCountText,
[this.selectors.notificationsCount]);
return expected === count;
}.bind(this));
return true;
},
clear: function() {
this.client.executeAsyncScript(function() {
var clearAll = document.getElementById('notification-clear');
var event = document.createEvent('CustomEvent');
event.initCustomEvent('click', true, true, {});
clearAll.dispatchEvent(event);
marionetteScriptFinished(true);
});
this.waitForNotificationCount(0);
},
_getNotificationsCountText: function(selector) {
var element = document.querySelector(selector);
var args = JSON.parse(element.dataset.l10nArgs);
return parseInt(args.n);
}
};
module.exports = {
NotificationTest: NotificationTest,
NotificationList: NotificationList
};