mirror of
https://git.FreeBSD.org/ports.git
synced 2024-12-18 03:46:03 +00:00
0ccec1792b
- Update gmp-api to 35.0 - Update openh264 to 1.2 - Update NSS to 3.17.3 - Update Firefox to 34.0.5 - Update Firefox ESR 31.3.0 - Update libxul to 31.3.0 - Improve CONFIGURE_TARGET handling - Always build using client.mk - Switch to clang by default on systems without libc++ (/stable/8 and /stable/9) - Drop lang/python2 dependency, only lang/python27 is required to build - Use DuckDuckGo searchplugin from upstream (has suggestions and purposes) - Backport a few about:memory fixes - Backport Web Notifications libnotify integration - Add GTK3 option for www/firefox. Adwaita is a bit broken since Gtk 3.14, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1073117 PR: 195559 Submitted by: Jan Beich MFH: 2014Q4 Security: http://vuxml.org/freebsd/7ae61870-9dd2-4884-a2f2-f19bb5784d09.html
392 lines
14 KiB
Plaintext
392 lines
14 KiB
Plaintext
commit a33d4f7
|
|
Author: Martin Stransky <stransky@redhat.com>
|
|
Date: Fri Nov 14 04:04:00 2014 +0100
|
|
|
|
Bug 858919 - Add support for libnotify calls which was removed for new notification API. r=karlt
|
|
---
|
|
toolkit/components/alerts/nsAlertsService.cpp | 10 +--
|
|
toolkit/system/gnome/moz.build | 2 +
|
|
toolkit/system/gnome/nsAlertsIconListener.cpp | 64 ++++++++++++------
|
|
toolkit/system/gnome/nsAlertsIconListener.h | 89 ++++++++++++++++++++++++++
|
|
toolkit/system/gnome/nsGnomeModule.cpp | 5 ++
|
|
toolkit/system/gnome/nsSystemAlertsService.cpp | 54 ++++++++++++++++
|
|
toolkit/system/gnome/nsSystemAlertsService.h | 27 ++++++++
|
|
7 files changed, 226 insertions(+), 25 deletions(-)
|
|
|
|
diff --git toolkit/components/alerts/nsAlertsService.cpp toolkit/components/alerts/nsAlertsService.cpp
|
|
index 93f4536..f8b5e07 100644
|
|
--- toolkit/components/alerts/nsAlertsService.cpp
|
|
+++ toolkit/components/alerts/nsAlertsService.cpp
|
|
@@ -100,9 +100,11 @@ NS_IMETHODIMP nsAlertsService::ShowAlertNotification(const nsAString & aImageUrl
|
|
nsCOMPtr<nsIAlertsService> sysAlerts(do_GetService(NS_SYSTEMALERTSERVICE_CONTRACTID));
|
|
nsresult rv;
|
|
if (sysAlerts) {
|
|
- return sysAlerts->ShowAlertNotification(aImageUrl, aAlertTitle, aAlertText, aAlertTextClickable,
|
|
- aAlertCookie, aAlertListener, aAlertName,
|
|
- aBidi, aLang, IPC::Principal(aPrincipal));
|
|
+ rv = sysAlerts->ShowAlertNotification(aImageUrl, aAlertTitle, aAlertText, aAlertTextClickable,
|
|
+ aAlertCookie, aAlertListener, aAlertName,
|
|
+ aBidi, aLang, IPC::Principal(aPrincipal));
|
|
+ if (NS_SUCCEEDED(rv))
|
|
+ return NS_OK;
|
|
}
|
|
|
|
if (!ShouldShowAlert()) {
|
|
diff --git toolkit/system/gnome/moz.build toolkit/system/gnome/moz.build
|
|
index c033f8b..9242209 100644
|
|
--- toolkit/system/gnome/moz.build
|
|
+++ toolkit/system/gnome/moz.build
|
|
@@ -5,7 +5,9 @@
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
SOURCES += [
|
|
+ 'nsAlertsIconListener.cpp',
|
|
'nsGnomeModule.cpp',
|
|
+ 'nsSystemAlertsService.cpp',
|
|
]
|
|
|
|
if CONFIG['MOZ_ENABLE_GCONF']:
|
|
diff --git toolkit/system/gnome/nsAlertsIconListener.cpp toolkit/system/gnome/nsAlertsIconListener.cpp
|
|
index f39335e..55f4356 100644
|
|
--- toolkit/system/gnome/nsAlertsIconListener.cpp
|
|
+++ toolkit/system/gnome/nsAlertsIconListener.cpp
|
|
@@ -51,6 +51,21 @@ static void notify_closed_marshal(GClosure* closure,
|
|
NS_RELEASE(alert);
|
|
}
|
|
|
|
+static GdkPixbuf*
|
|
+GetPixbufFromImgRequest(imgIRequest* aRequest)
|
|
+{
|
|
+ nsCOMPtr<imgIContainer> image;
|
|
+ nsresult rv = aRequest->GetImage(getter_AddRefs(image));
|
|
+ if (NS_FAILED(rv)) {
|
|
+ return nullptr;
|
|
+ }
|
|
+
|
|
+ nsCOMPtr<nsIImageToPixbuf> imgToPixbuf =
|
|
+ do_GetService("@mozilla.org/widget/image-to-gdk-pixbuf;1");
|
|
+
|
|
+ return imgToPixbuf->ConvertImageToPixbuf(image);
|
|
+}
|
|
+
|
|
NS_IMPL_ISUPPORTS(nsAlertsIconListener, imgINotificationObserver,
|
|
nsIObserver, nsISupportsWeakReference)
|
|
|
|
@@ -106,47 +121,45 @@ nsAlertsIconListener::Notify(imgIRequest *aRequest, int32_t aType, const nsIntRe
|
|
nsresult
|
|
nsAlertsIconListener::OnStopRequest(imgIRequest* aRequest)
|
|
{
|
|
+ NS_ASSERTION(mIconRequest == aRequest, "aRequest does not match!");
|
|
+
|
|
uint32_t imgStatus = imgIRequest::STATUS_ERROR;
|
|
nsresult rv = aRequest->GetImageStatus(&imgStatus);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
if (imgStatus == imgIRequest::STATUS_ERROR && !mLoadedFrame) {
|
|
// We have an error getting the image. Display the notification with no icon.
|
|
ShowAlert(nullptr);
|
|
- }
|
|
|
|
- if (mIconRequest) {
|
|
+ // Cancel any pending request
|
|
mIconRequest->Cancel(NS_BINDING_ABORTED);
|
|
mIconRequest = nullptr;
|
|
}
|
|
+
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
nsAlertsIconListener::OnStopFrame(imgIRequest* aRequest)
|
|
{
|
|
- if (aRequest != mIconRequest)
|
|
- return NS_ERROR_FAILURE;
|
|
+ NS_ASSERTION(mIconRequest == aRequest, "aRequest does not match!");
|
|
|
|
if (mLoadedFrame)
|
|
return NS_OK; // only use one frame
|
|
|
|
- nsCOMPtr<imgIContainer> image;
|
|
- nsresult rv = aRequest->GetImage(getter_AddRefs(image));
|
|
- if (NS_FAILED(rv))
|
|
- return rv;
|
|
-
|
|
- nsCOMPtr<nsIImageToPixbuf> imgToPixbuf =
|
|
- do_GetService("@mozilla.org/widget/image-to-gdk-pixbuf;1");
|
|
-
|
|
- GdkPixbuf* imagePixbuf = imgToPixbuf->ConvertImageToPixbuf(image);
|
|
- if (!imagePixbuf)
|
|
- return NS_ERROR_FAILURE;
|
|
+ GdkPixbuf* imagePixbuf = GetPixbufFromImgRequest(aRequest);
|
|
+ if (!imagePixbuf) {
|
|
+ ShowAlert(nullptr);
|
|
+ } else {
|
|
+ ShowAlert(imagePixbuf);
|
|
+ g_object_unref(imagePixbuf);
|
|
+ }
|
|
|
|
- ShowAlert(imagePixbuf);
|
|
+ mLoadedFrame = true;
|
|
|
|
- g_object_unref(imagePixbuf);
|
|
+ // Cancel any pending request (multipart image loading/decoding for instance)
|
|
+ mIconRequest->Cancel(NS_BINDING_ABORTED);
|
|
+ mIconRequest = nullptr;
|
|
|
|
- mLoadedFrame = true;
|
|
return NS_OK;
|
|
}
|
|
|
|
@@ -180,6 +193,9 @@ nsAlertsIconListener::ShowAlert(GdkPixbuf* aPixbuf)
|
|
mClosureHandler = g_signal_connect_closure(mNotification, "closed", closure, FALSE);
|
|
gboolean result = notify_notification_show(mNotification, nullptr);
|
|
|
|
+ if (result && mAlertListener)
|
|
+ mAlertListener->Observe(nullptr, "alertshow", mAlertCookie.get());
|
|
+
|
|
return result ? NS_OK : NS_ERROR_FAILURE;
|
|
}
|
|
|
|
@@ -201,9 +217,15 @@ nsAlertsIconListener::StartRequest(const nsAString & aImageUrl)
|
|
if (!il)
|
|
return ShowAlert(nullptr);
|
|
|
|
- return il->LoadImageXPCOM(imageUri, nullptr, nullptr, nullptr, nullptr,
|
|
- this, nullptr, nsIRequest::LOAD_NORMAL, nullptr,
|
|
- nullptr, getter_AddRefs(mIconRequest));
|
|
+ nsresult rv = il->LoadImageXPCOM(imageUri, nullptr, nullptr, nullptr, nullptr,
|
|
+ this, nullptr, nsIRequest::LOAD_NORMAL, nullptr,
|
|
+ 0 /* use default */, getter_AddRefs(mIconRequest));
|
|
+ if (NS_FAILED(rv))
|
|
+ return rv;
|
|
+
|
|
+ mIconRequest->StartDecoding();
|
|
+
|
|
+ return NS_OK;
|
|
}
|
|
|
|
void
|
|
diff --git toolkit/system/gnome/nsAlertsIconListener.h toolkit/system/gnome/nsAlertsIconListener.h
|
|
new file mode 100644
|
|
index 0000000..ac96db9
|
|
--- /dev/null
|
|
+++ toolkit/system/gnome/nsAlertsIconListener.h
|
|
@@ -0,0 +1,89 @@
|
|
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
+/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
+
|
|
+#ifndef nsAlertsIconListener_h__
|
|
+#define nsAlertsIconListener_h__
|
|
+
|
|
+#include "nsCOMPtr.h"
|
|
+#include "imgINotificationObserver.h"
|
|
+#include "nsStringAPI.h"
|
|
+#include "nsIObserver.h"
|
|
+#include "nsWeakReference.h"
|
|
+
|
|
+#include <gdk-pixbuf/gdk-pixbuf.h>
|
|
+
|
|
+class imgIRequest;
|
|
+
|
|
+struct NotifyNotification;
|
|
+
|
|
+class nsAlertsIconListener : public imgINotificationObserver,
|
|
+ public nsIObserver,
|
|
+ public nsSupportsWeakReference
|
|
+{
|
|
+public:
|
|
+ NS_DECL_ISUPPORTS
|
|
+ NS_DECL_IMGINOTIFICATIONOBSERVER
|
|
+ NS_DECL_NSIOBSERVER
|
|
+
|
|
+ nsAlertsIconListener();
|
|
+
|
|
+ nsresult InitAlertAsync(const nsAString & aImageUrl,
|
|
+ const nsAString & aAlertTitle,
|
|
+ const nsAString & aAlertText,
|
|
+ bool aAlertTextClickable,
|
|
+ const nsAString & aAlertCookie,
|
|
+ nsIObserver * aAlertListener);
|
|
+
|
|
+ void SendCallback();
|
|
+ void SendClosed();
|
|
+
|
|
+protected:
|
|
+ virtual ~nsAlertsIconListener();
|
|
+
|
|
+ nsresult OnStopRequest(imgIRequest* aRequest);
|
|
+ nsresult OnStopFrame(imgIRequest* aRequest);
|
|
+
|
|
+ /**
|
|
+ * The only difference between libnotify.so.4 and libnotify.so.1 for these symbols
|
|
+ * is that notify_notification_new takes three arguments in libnotify.so.4 and
|
|
+ * four in libnotify.so.1.
|
|
+ * Passing the fourth argument as NULL is binary compatible.
|
|
+ */
|
|
+ typedef void (*NotifyActionCallback)(NotifyNotification*, char*, gpointer);
|
|
+ typedef bool (*notify_is_initted_t)(void);
|
|
+ typedef bool (*notify_init_t)(const char*);
|
|
+ typedef GList* (*notify_get_server_caps_t)(void);
|
|
+ typedef NotifyNotification* (*notify_notification_new_t)(const char*, const char*, const char*, const char*);
|
|
+ typedef bool (*notify_notification_show_t)(void*, char*);
|
|
+ typedef void (*notify_notification_set_icon_from_pixbuf_t)(void*, GdkPixbuf*);
|
|
+ typedef void (*notify_notification_add_action_t)(void*, const char*, const char*, NotifyActionCallback, gpointer, GFreeFunc);
|
|
+
|
|
+ nsCOMPtr<imgIRequest> mIconRequest;
|
|
+ nsCString mAlertTitle;
|
|
+ nsCString mAlertText;
|
|
+
|
|
+ nsCOMPtr<nsIObserver> mAlertListener;
|
|
+ nsString mAlertCookie;
|
|
+
|
|
+ bool mLoadedFrame;
|
|
+ bool mAlertHasAction;
|
|
+
|
|
+ static void* libNotifyHandle;
|
|
+ static bool libNotifyNotAvail;
|
|
+ static notify_is_initted_t notify_is_initted;
|
|
+ static notify_init_t notify_init;
|
|
+ static notify_get_server_caps_t notify_get_server_caps;
|
|
+ static notify_notification_new_t notify_notification_new;
|
|
+ static notify_notification_show_t notify_notification_show;
|
|
+ static notify_notification_set_icon_from_pixbuf_t notify_notification_set_icon_from_pixbuf;
|
|
+ static notify_notification_add_action_t notify_notification_add_action;
|
|
+ NotifyNotification* mNotification;
|
|
+ gulong mClosureHandler;
|
|
+
|
|
+ nsresult StartRequest(const nsAString & aImageUrl);
|
|
+ nsresult ShowAlert(GdkPixbuf* aPixbuf);
|
|
+};
|
|
+
|
|
+#endif
|
|
diff --git toolkit/system/gnome/nsGnomeModule.cpp toolkit/system/gnome/nsGnomeModule.cpp
|
|
index 5ccc8e5..f893893 100644
|
|
--- toolkit/system/gnome/nsGnomeModule.cpp
|
|
+++ toolkit/system/gnome/nsGnomeModule.cpp
|
|
@@ -22,6 +22,8 @@ NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGnomeVFSService, Init)
|
|
NS_GENERIC_FACTORY_CONSTRUCTOR(nsGIOService)
|
|
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGSettingsService, Init)
|
|
#endif
|
|
+#include "nsSystemAlertsService.h"
|
|
+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsSystemAlertsService, Init)
|
|
|
|
#ifdef MOZ_ENABLE_GCONF
|
|
NS_DEFINE_NAMED_CID(NS_GCONFSERVICE_CID);
|
|
@@ -33,6 +35,7 @@ NS_DEFINE_NAMED_CID(NS_GNOMEVFSSERVICE_CID);
|
|
NS_DEFINE_NAMED_CID(NS_GIOSERVICE_CID);
|
|
NS_DEFINE_NAMED_CID(NS_GSETTINGSSERVICE_CID);
|
|
#endif
|
|
+NS_DEFINE_NAMED_CID(NS_SYSTEMALERTSSERVICE_CID);
|
|
|
|
static const mozilla::Module::CIDEntry kGnomeCIDs[] = {
|
|
#ifdef MOZ_ENABLE_GCONF
|
|
@@ -45,6 +48,7 @@ static const mozilla::Module::CIDEntry kGnomeCIDs[] = {
|
|
{ &kNS_GIOSERVICE_CID, false, nullptr, nsGIOServiceConstructor },
|
|
{ &kNS_GSETTINGSSERVICE_CID, false, nullptr, nsGSettingsServiceConstructor },
|
|
#endif
|
|
+ { &kNS_SYSTEMALERTSSERVICE_CID, false, nullptr, nsSystemAlertsServiceConstructor },
|
|
{ nullptr }
|
|
};
|
|
|
|
@@ -59,6 +63,7 @@ static const mozilla::Module::ContractIDEntry kGnomeContracts[] = {
|
|
{ NS_GIOSERVICE_CONTRACTID, &kNS_GIOSERVICE_CID },
|
|
{ NS_GSETTINGSSERVICE_CONTRACTID, &kNS_GSETTINGSSERVICE_CID },
|
|
#endif
|
|
+ { NS_SYSTEMALERTSERVICE_CONTRACTID, &kNS_SYSTEMALERTSSERVICE_CID },
|
|
{ nullptr }
|
|
};
|
|
|
|
diff --git toolkit/system/gnome/nsSystemAlertsService.cpp toolkit/system/gnome/nsSystemAlertsService.cpp
|
|
new file mode 100644
|
|
index 0000000..b91b402
|
|
--- /dev/null
|
|
+++ toolkit/system/gnome/nsSystemAlertsService.cpp
|
|
@@ -0,0 +1,53 @@
|
|
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode:nil; c-basic-offset: 2 -*- */
|
|
+/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
+
|
|
+#include "nsXULAppAPI.h"
|
|
+#include "nsSystemAlertsService.h"
|
|
+#include "nsAlertsIconListener.h"
|
|
+#include "nsAutoPtr.h"
|
|
+
|
|
+NS_IMPL_ADDREF(nsSystemAlertsService)
|
|
+NS_IMPL_RELEASE(nsSystemAlertsService)
|
|
+
|
|
+NS_INTERFACE_MAP_BEGIN(nsSystemAlertsService)
|
|
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIAlertsService)
|
|
+ NS_INTERFACE_MAP_ENTRY(nsIAlertsService)
|
|
+NS_INTERFACE_MAP_END_THREADSAFE
|
|
+
|
|
+nsSystemAlertsService::nsSystemAlertsService()
|
|
+{
|
|
+}
|
|
+
|
|
+nsSystemAlertsService::~nsSystemAlertsService()
|
|
+{}
|
|
+
|
|
+nsresult
|
|
+nsSystemAlertsService::Init()
|
|
+{
|
|
+ return NS_OK;
|
|
+}
|
|
+
|
|
+NS_IMETHODIMP nsSystemAlertsService::ShowAlertNotification(const nsAString & aImageUrl, const nsAString & aAlertTitle,
|
|
+ const nsAString & aAlertText, bool aAlertTextClickable,
|
|
+ const nsAString & aAlertCookie,
|
|
+ nsIObserver * aAlertListener,
|
|
+ const nsAString & aAlertName,
|
|
+ const nsAString & aBidi,
|
|
+ const nsAString & aLang,
|
|
+ nsIPrincipal * aPrincipal)
|
|
+{
|
|
+ nsRefPtr<nsAlertsIconListener> alertListener = new nsAlertsIconListener();
|
|
+ if (!alertListener)
|
|
+ return NS_ERROR_OUT_OF_MEMORY;
|
|
+
|
|
+ return alertListener->InitAlertAsync(aImageUrl, aAlertTitle, aAlertText, aAlertTextClickable,
|
|
+ aAlertCookie, aAlertListener);
|
|
+}
|
|
+
|
|
+NS_IMETHODIMP nsSystemAlertsService::CloseAlert(const nsAString& aAlertName,
|
|
+ nsIPrincipal* aPrincipal)
|
|
+{
|
|
+ return NS_ERROR_NOT_IMPLEMENTED;
|
|
+}
|
|
diff --git toolkit/system/gnome/nsSystemAlertsService.h toolkit/system/gnome/nsSystemAlertsService.h
|
|
new file mode 100644
|
|
index 0000000..b0bd625
|
|
--- /dev/null
|
|
+++ toolkit/system/gnome/nsSystemAlertsService.h
|
|
@@ -0,0 +1,27 @@
|
|
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
+/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
+
|
|
+#ifndef nsSystemAlertsService_h__
|
|
+#define nsSystemAlertsService_h__
|
|
+
|
|
+#include "nsIAlertsService.h"
|
|
+#include "nsCOMPtr.h"
|
|
+
|
|
+class nsSystemAlertsService : public nsIAlertsService
|
|
+{
|
|
+public:
|
|
+ NS_DECL_NSIALERTSSERVICE
|
|
+ NS_DECL_ISUPPORTS
|
|
+
|
|
+ nsSystemAlertsService();
|
|
+
|
|
+ nsresult Init();
|
|
+
|
|
+protected:
|
|
+ virtual ~nsSystemAlertsService();
|
|
+
|
|
+};
|
|
+
|
|
+#endif /* nsSystemAlertsService_h__ */
|