зеркало из https://github.com/mozilla/gecko-dev.git
Bug 457632: notificationbox doesn't remove notifications immediately. r=neil@parkwaycc.co.uk
This commit is contained in:
Родитель
4056ed9e13
Коммит
cda6d26c29
|
@ -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>
|
||||
|
|
Загрузка…
Ссылка в новой задаче