diff options
Diffstat (limited to 'toolkit/components/alerts')
-rw-r--r-- | toolkit/components/alerts/nsAlertsService.cpp | 23 | ||||
-rw-r--r-- | toolkit/components/alerts/nsAlertsService.h | 17 | ||||
-rw-r--r-- | toolkit/components/alerts/resources/content/alert.css | 1 | ||||
-rw-r--r-- | toolkit/components/alerts/resources/content/alert.js | 38 | ||||
-rw-r--r-- | toolkit/components/alerts/resources/content/alert.xul | 1 |
5 files changed, 43 insertions, 37 deletions
diff --git a/toolkit/components/alerts/nsAlertsService.cpp b/toolkit/components/alerts/nsAlertsService.cpp index 35418dd17..dd67ad983 100644 --- a/toolkit/components/alerts/nsAlertsService.cpp +++ b/toolkit/components/alerts/nsAlertsService.cpp @@ -22,6 +22,10 @@ #include "nsIFaviconService.h" #endif // MOZ_PLACES +#ifdef XP_WIN +#include <shellapi.h> +#endif + using namespace mozilla; using mozilla::dom::ContentChild; @@ -154,23 +158,12 @@ bool nsAlertsService::ShouldShowAlert() bool result = true; #ifdef XP_WIN - HMODULE shellDLL = ::LoadLibraryW(L"shell32.dll"); - if (!shellDLL) - return result; - - SHQueryUserNotificationStatePtr pSHQueryUserNotificationState = - (SHQueryUserNotificationStatePtr) ::GetProcAddress(shellDLL, "SHQueryUserNotificationState"); - - if (pSHQueryUserNotificationState) { - MOZ_QUERY_USER_NOTIFICATION_STATE qstate; - if (SUCCEEDED(pSHQueryUserNotificationState(&qstate))) { - if (qstate != QUNS_ACCEPTS_NOTIFICATIONS) { - result = false; - } + QUERY_USER_NOTIFICATION_STATE qstate; + if (SUCCEEDED(SHQueryUserNotificationState(&qstate))) { + if (qstate != QUNS_ACCEPTS_NOTIFICATIONS) { + result = false; } } - - ::FreeLibrary(shellDLL); #endif return result; diff --git a/toolkit/components/alerts/nsAlertsService.h b/toolkit/components/alerts/nsAlertsService.h index 3f23eaabf..d2b2e1e6c 100644 --- a/toolkit/components/alerts/nsAlertsService.h +++ b/toolkit/components/alerts/nsAlertsService.h @@ -10,23 +10,6 @@ #include "nsCOMPtr.h" #include "nsXULAlerts.h" -#ifdef XP_WIN -typedef enum tagMOZ_QUERY_USER_NOTIFICATION_STATE { - QUNS_NOT_PRESENT = 1, - QUNS_BUSY = 2, - QUNS_RUNNING_D3D_FULL_SCREEN = 3, - QUNS_PRESENTATION_MODE = 4, - QUNS_ACCEPTS_NOTIFICATIONS = 5, - QUNS_QUIET_TIME = 6, - QUNS_IMMERSIVE = 7 -} MOZ_QUERY_USER_NOTIFICATION_STATE; - -extern "C" { -// This function is Windows Vista or later -typedef HRESULT (__stdcall *SHQueryUserNotificationStatePtr)(MOZ_QUERY_USER_NOTIFICATION_STATE *pquns); -} -#endif // defined(XP_WIN) - class nsAlertsService : public nsIAlertsService, public nsIAlertsDoNotDisturb { diff --git a/toolkit/components/alerts/resources/content/alert.css b/toolkit/components/alerts/resources/content/alert.css index c4d94a543..81e5cdd35 100644 --- a/toolkit/components/alerts/resources/content/alert.css +++ b/toolkit/components/alerts/resources/content/alert.css @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #alertBox[animate] { - animation-duration: 20s; animation-fill-mode: both; animation-name: alert-animation; } diff --git a/toolkit/components/alerts/resources/content/alert.js b/toolkit/components/alerts/resources/content/alert.js index 523ec378e..ce60ab0fa 100644 --- a/toolkit/components/alerts/resources/content/alert.js +++ b/toolkit/components/alerts/resources/content/alert.js @@ -7,7 +7,21 @@ var {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; Cu.import("resource://gre/modules/AppConstants.jsm"); Cu.import("resource://gre/modules/Services.jsm"); -// Copied from nsILookAndFeel.h, see comments on eMetric_AlertNotificationOrigin +/* + * This indicates from which corner of the screen alerts slide in, + * and from which direction (horizontal/vertical). + * 0, the default, represents bottom right, sliding vertically. + * Use any bitwise combination of the following constants: + * NS_ALERT_HORIZONTAL (1), NS_ALERT_LEFT (2), NS_ALERT_TOP (4). + * + * 6 4 + * +-----------+ + * 7| |5 + * | | + * 3| |1 + * +-----------+ + * 2 0 + */ const NS_ALERT_HORIZONTAL = 1; const NS_ALERT_LEFT = 2; const NS_ALERT_TOP = 4; @@ -41,6 +55,8 @@ function prefillAlertInfo() { // arguments[11] -> the nsIURI.hostPort of the origin, optional // arguments[12] -> the alert icon URL, optional + document.getElementById('alertTime').setAttribute('value', (new Date).getTime()); + switch (window.arguments.length) { default: case 13: { @@ -150,7 +166,12 @@ function prefillAlertInfo() { } function onAlertLoad() { - const ALERT_DURATION_IMMEDIATE = 20000; + const ALERT_DURATION_IMMEDIATE_MIN = 4000; + const ALERT_DURATION_IMMEDIATE_MAX = 60000; + let alertDurationImmediate = Services.prefs.getIntPref("alerts.durationImmediate", ALERT_DURATION_IMMEDIATE_MIN); + alertDurationImmediate = alertDurationImmediate >= ALERT_DURATION_IMMEDIATE_MIN + && alertDurationImmediate <= ALERT_DURATION_IMMEDIATE_MAX + ? alertDurationImmediate : ALERT_DURATION_IMMEDIATE_MIN; let alertTextBox = document.getElementById("alertTextBox"); let alertImageBox = document.getElementById("alertImageBox"); alertImageBox.style.minHeight = alertTextBox.scrollHeight + "px"; @@ -170,7 +191,7 @@ function onAlertLoad() { // If the require interaction flag is set, prevent auto-closing the notification. if (!gRequireInteraction) { if (Services.prefs.getBoolPref("alerts.disableSlidingEffect")) { - setTimeout(function() { window.close(); }, ALERT_DURATION_IMMEDIATE); + setTimeout(function() { window.close(); }, alertDurationImmediate); } else { let alertBox = document.getElementById("alertBox"); alertBox.addEventListener("animationend", function hideAlert(event) { @@ -181,6 +202,7 @@ function onAlertLoad() { window.close(); } }, false); + alertBox.style.animationDuration = Math.round(alertDurationImmediate / 1000).toString() + "s"; alertBox.setAttribute("animate", true); } } @@ -235,7 +257,15 @@ function moveWindowToEnd() { let windows = Services.wm.getEnumerator("alert:alert"); while (windows.hasMoreElements()) { let alertWindow = windows.getNext(); - if (alertWindow != window) { + let alertWindowTime = Number( + alertWindow.document.getElementById('alertTime').getAttribute('value')); + let windowTime = Number( + window.document.getElementById('alertTime').getAttribute('value')); + // The time of window creation. + // Otherwise calling the notification twice (and more) in a row + // does not work. + // See https://bugzilla.mozilla.org/show_bug.cgi?id=1263155 + if ((alertWindow != window) && (alertWindowTime <= windowTime)) { if (gOrigin & NS_ALERT_TOP) { y = Math.max(y, alertWindow.screenY + alertWindow.outerHeight - WINDOW_SHADOW_SPREAD); } else { diff --git a/toolkit/components/alerts/resources/content/alert.xul b/toolkit/components/alerts/resources/content/alert.xul index 8597d9954..1549f4530 100644 --- a/toolkit/components/alerts/resources/content/alert.xul +++ b/toolkit/components/alerts/resources/content/alert.xul @@ -24,6 +24,7 @@ <script type="application/javascript" src="chrome://global/content/alerts/alert.js"/> <vbox id="alertBox" class="alertBox"> + <label id="alertTime" value="" hidden="true"/> <box id="alertTitleBox"> <image id="alertIcon"/> <label id="alertTitleLabel" class="alertTitle plain" crop="end"/> |