Bug 457632: notificationbox doesn't remove notifications immediately. r=neil@parkwaycc.co.uk

This commit is contained in:
Dave Townsend 2008-10-09 10:35:01 +01:00
Родитель 4056ed9e13
Коммит cda6d26c29
3 изменённых файлов: 219 добавлений и 13 удалений

Просмотреть файл

@ -48,6 +48,7 @@ _TEST_FILES = test_bug360220.xul \
test_bug359754.xul \
test_bug365773.xul \
test_bug382990.xul \
test_bug457632.xul \
test_closemenu_attribute.xul \
test_colorpicker_popup.xul \
test_deck.xul \

Просмотреть файл

@ -0,0 +1,179 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="/tests/SimpleTest/test.css" type="text/css"?>
<!--
XUL Widget Test for bug 457632
-->
<window title="Bug 457632" width="500" height="600"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="/MochiKit/packed.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<notificationbox id="nb"/>
<!-- test results are displayed in the html:body -->
<body xmlns="http://www.w3.org/1999/xhtml" style="height: 300px; overflow: auto;"
onload="test()"/>
<!-- test code goes here -->
<script type="application/javascript">
<![CDATA[
var gNotificationBox;
function completeAnimation(nextTest) {
if (!gNotificationBox._timer) {
nextTest();
return;
}
setTimeout(completeAnimation, 50, nextTest);
}
function test() {
SimpleTest.waitForExplicitFinish();
gNotificationBox = document.getElementById("nb");
is(gNotificationBox.allNotifications.length, 0, "There should be no initial notifications");
gNotificationBox.appendNotification("Test notification",
"notification1", null,
gNotificationBox.PRIORITY_INFO_LOW,
null);
is(gNotificationBox.allNotifications.length, 1, "Notification exists while animating in");
let notification = gNotificationBox.getNotificationWithValue("notification1");
ok(notification, "Notification should exist while animating in");
// Wait for the notificaton to finish displaying
completeAnimation(test1);
}
// Tests that a notification that is fully animated in gets removed immediately
function test1() {
let notification = gNotificationBox.getNotificationWithValue("notification1");
gNotificationBox.removeNotification(notification);
notification = gNotificationBox.getNotificationWithValue("notification1");
ok(!notification, "Test 1 showed notification was still present");
ok(!gNotificationBox.currentNotification, "Test 1 said there was still a current notification");
is(gNotificationBox.allNotifications.length, 0, "Test 1 should show no notifications present");
// Wait for the notificaton to finish hiding
completeAnimation(test2);
}
// Tests that a notification that is animating in gets removed immediately
function test2() {
let notification = gNotificationBox.appendNotification("Test notification",
"notification2", null,
gNotificationBox.PRIORITY_INFO_LOW,
null);
gNotificationBox.removeNotification(notification);
notification = gNotificationBox.getNotificationWithValue("notification2");
ok(!notification, "Test 2 showed notification was still present");
ok(!gNotificationBox.currentNotification, "Test 2 said there was still a current notification");
is(gNotificationBox.allNotifications.length, 0, "Test 2 should show no notifications present");
// Get rid of the hiding notifications
gNotificationBox.removeAllNotifications(true);
test3();
}
// Tests that a background notification goes away immediately
function test3() {
let notification = gNotificationBox.appendNotification("Test notification",
"notification3", null,
gNotificationBox.PRIORITY_INFO_LOW,
null);
let notification2 = gNotificationBox.appendNotification("Test notification",
"notification4", null,
gNotificationBox.PRIORITY_INFO_LOW,
null);
is(gNotificationBox.allNotifications.length, 2, "Test 3 should show 2 notifications present");
gNotificationBox.removeNotification(notification);
is(gNotificationBox.allNotifications.length, 1, "Test 3 should show 1 notifications present");
notification = gNotificationBox.getNotificationWithValue("notification3");
ok(!notification, "Test 3 showed notification was still present");
gNotificationBox.removeNotification(notification2);
is(gNotificationBox.allNotifications.length, 0, "Test 3 should show 0 notifications present");
notification2 = gNotificationBox.getNotificationWithValue("notification4");
ok(!notification2, "Test 3 showed notification2 was still present");
ok(!gNotificationBox.currentNotification, "Test 3 said there was still a current notification");
// Get rid of the hiding notifications
gNotificationBox.removeAllNotifications(true);
test4();
}
// Tests that a foreground notification hiding a background one goes away
function test4() {
let notification = gNotificationBox.appendNotification("Test notification",
"notification5", null,
gNotificationBox.PRIORITY_INFO_LOW,
null);
let notification2 = gNotificationBox.appendNotification("Test notification",
"notification6", null,
gNotificationBox.PRIORITY_INFO_LOW,
null);
gNotificationBox.removeNotification(notification2);
notification2 = gNotificationBox.getNotificationWithValue("notification6");
ok(!notification2, "Test 4 showed notification2 was still present");
is(gNotificationBox.currentNotification, notification, "Test 4 said the current notification was wrong");
is(gNotificationBox.allNotifications.length, 1, "Test 4 should show 1 notifications present");
gNotificationBox.removeNotification(notification);
notification = gNotificationBox.getNotificationWithValue("notification5");
ok(!notification, "Test 4 showed notification was still present");
ok(!gNotificationBox.currentNotification, "Test 4 said there was still a current notification");
is(gNotificationBox.allNotifications.length, 0, "Test 4 should show 0 notifications present");
// Get rid of the hiding notifications
gNotificationBox.removeAllNotifications(true);
test5();
}
// Tests that removeAllNotifications gets rid of everything
function test5() {
let notification = gNotificationBox.appendNotification("Test notification",
"notification7", null,
gNotificationBox.PRIORITY_INFO_LOW,
null);
let notification2 = gNotificationBox.appendNotification("Test notification",
"notification8", null,
gNotificationBox.PRIORITY_INFO_LOW,
null);
gNotificationBox.removeAllNotifications();
notification = gNotificationBox.getNotificationWithValue("notification7");
notification2 = gNotificationBox.getNotificationWithValue("notification8");
ok(!notification, "Test 5 showed notification was still present");
ok(!notification2, "Test 5 showed notification2 was still present");
ok(!gNotificationBox.currentNotification, "Test 5 said there was still a current notification");
is(gNotificationBox.allNotifications.length, 0, "Test 5 should show 0 notifications present");
gNotificationBox.appendNotification("Test notification",
"notification9", null,
gNotificationBox.PRIORITY_INFO_LOW,
null);
// Wait for the notificaton to finish displaying
completeAnimation(test6);
}
// Tests whether removing an already removed notification doesn't break things
function test6() {
let notification = gNotificationBox.getNotificationWithValue("notification9");
ok(notification, "Test 6 should have an initial notification");
gNotificationBox.removeNotification(notification);
gNotificationBox.removeNotification(notification);
ok(!gNotificationBox.currentNotification, "Test 6 shouldn't be any current notification");
is(gNotificationBox.allNotifications.length, 0, "Test 6 allNotifications.length should be 0");
notification = gNotificationBox.appendNotification("Test notification",
"notification10", null,
gNotificationBox.PRIORITY_INFO_LOW,
null);
is(notification, gNotificationBox.currentNotification, "Test 6 should have made the current notification");
gNotificationBox.removeNotification(notification);
SimpleTest.finish();
}
]]>
</script>
</window>

Просмотреть файл

@ -48,8 +48,15 @@
</setter>
</property>
<property name="allNotifications" readonly="true"
onget="return this.getElementsByTagName('notification');"/>
<property name="allNotifications" readonly="true">
<getter>
<![CDATA[
var closedNotification = this._closedNotification;
var notifications = this.getElementsByTagName('notification');
return Array.filter(notifications, function(n) n != closedNotification);
]]>
</getter>
</property>
<method name="getNotificationWithValue">
<parameter name="aValue"/>
@ -138,7 +145,7 @@
<![CDATA[
if (aItem == this.currentNotification)
this.removeCurrentNotification();
else
else if (aItem != this._closedNotification)
this.removeChild(aItem);
return aItem;
]]>
@ -166,6 +173,15 @@
this.removeNotification(notifications[n]);
}
this.currentNotification = null;
if (aImmediate && this._timer) {
// Must clear up any currently animating notification
clearInterval(this._timer);
if (this._closedNotification) {
this.removeChild(this._closedNotification);
this._closedNotification = null;
}
}
]]>
</body>
</method>
@ -196,9 +212,10 @@
this.currentNotification.style.marginTop = "0px";
this.currentNotification.style.opacity = 1;
}
if (this._closedNotification)
this._closedNotification.parentNode.
removeChild(this._closedNotification);
if (this._closedNotification) {
this.removeChild(this._closedNotification);
this._closedNotification = null;
}
this._setBlockingState(this.currentNotification);
}
@ -211,7 +228,6 @@
height = this.currentNotification.boxObject.height;
this.currentNotification = aNotification;
this._closedNotification = null;
aNotification.style.removeProperty("position");
aNotification.style.removeProperty("top");
aNotification.style.marginTop = -height + "px";
@ -222,7 +238,7 @@
change = -change;
this._closedNotification = aNotification;
var notifications = this.allNotifications;
var idx = notifications.length - 2;
var idx = notifications.length - 1;
if (idx >= 0)
this.currentNotification = notifications[idx];
else
@ -234,7 +250,14 @@
var opacitychange = change / height;
const FRAME_LENGTH = 50;
function slide(self, off) {
function slide(self, args, off) {
// If the notificationbox is disconnected then stop the timer
if (self.ownerDocument.compareDocumentPosition(self) &
Node.DOCUMENT_POSITION_DISCONNECTED) {
clearInterval(args.timer);
return;
}
var framesToHandle = 1;
// Skip frames if we aren't getting the desired frame rate.
@ -260,13 +283,16 @@
clearInterval(self._timer);
self._timer = null;
if (self._closedNotification)
self._closedNotification.parentNode.
removeChild(self._closedNotification);
if (self._closedNotification) {
self.removeChild(self._closedNotification);
self._closedNotification = null;
}
self._setBlockingState(self.currentNotification);
}
this._timer = setInterval(slide, FRAME_LENGTH, this);
var args = {};
this._timer = setInterval(slide, FRAME_LENGTH, this, args);
args.timer = this._timer;
]]>
</body>
</method>