Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 Nov 2014 10:43:07 GMT
From:      svn-freebsd-gecko@chruetertee.ch
To:        freebsd-gecko@freebsd.org
Subject:   [SVN-Commit] r1768 - in trunk: . mail/thunderbird/files www/firefox-esr/files www/firefox/files www/libxul/files www/seamonkey/files
Message-ID:  <201411221043.sAMAh76V083395@trillian.chruetertee.ch>

next in thread | raw e-mail | index | archive | help
Author: jbeich
Date: Sat Nov 22 10:43:07 2014
New Revision: 1768

Log:
improve web notifications

Added:
   trunk/mail/thunderbird/files/patch-bug858919
   trunk/www/firefox-esr/files/patch-bug858919
   trunk/www/firefox/files/patch-bug858919
   trunk/www/libxul/files/patch-bug858919
   trunk/www/seamonkey/files/patch-bug858919
Modified:
   trunk/Gecko_ChangeLog

Modified: trunk/Gecko_ChangeLog
==============================================================================
--- trunk/Gecko_ChangeLog	Sat Nov 22 09:13:32 2014	(r1767)
+++ trunk/Gecko_ChangeLog	Sat Nov 22 10:43:07 2014	(r1768)
@@ -4,6 +4,7 @@
 - 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[1]
 
 [1] Adwaita is a bit broken since Gtk 3.14, see

Added: trunk/mail/thunderbird/files/patch-bug858919
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/mail/thunderbird/files/patch-bug858919	Sat Nov 22 10:43:07 2014	(r1768)
@@ -0,0 +1,392 @@
+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
+--- mozilla/toolkit/components/alerts/nsAlertsService.cpp
++++ mozilla/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
+--- mozilla/toolkit/system/gnome/moz.build
++++ mozilla/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
+--- mozilla/toolkit/system/gnome/nsAlertsIconListener.cpp
++++ mozilla/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
++++ mozilla/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
+--- mozilla/toolkit/system/gnome/nsGnomeModule.cpp
++++ mozilla/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
++++ mozilla/toolkit/system/gnome/nsSystemAlertsService.cpp
+@@ -0,0 +1,54 @@
++/* -*- 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,
++                                                           const nsAString & aData,
++                                                           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
++++ mozilla/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__ */

Added: trunk/www/firefox-esr/files/patch-bug858919
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/www/firefox-esr/files/patch-bug858919	Sat Nov 22 10:43:07 2014	(r1768)
@@ -0,0 +1,392 @@
+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,54 @@
++/* -*- 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,
++                                                           const nsAString & aData,
++                                                           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__ */

Added: trunk/www/firefox/files/patch-bug858919
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/www/firefox/files/patch-bug858919	Sat Nov 22 10:43:07 2014	(r1768)
@@ -0,0 +1,394 @@
+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,10 +100,12 @@ 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, aData,
+-                                            IPC::Principal(aPrincipal));
++    rv = sysAlerts->ShowAlertNotification(aImageUrl, aAlertTitle, aAlertText, aAlertTextClickable,
++                                          aAlertCookie, aAlertListener, aAlertName,
++                                          aBidi, aLang, aData,
++                                          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,54 @@
++/* -*- 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,
++                                                           const nsAString & aData,
++                                                           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__ */

Added: trunk/www/libxul/files/patch-bug858919
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/www/libxul/files/patch-bug858919	Sat Nov 22 10:43:07 2014	(r1768)
@@ -0,0 +1,392 @@
+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,54 @@
++/* -*- 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,
++                                                           const nsAString & aData,
++                                                           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__ */

Added: trunk/www/seamonkey/files/patch-bug858919
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/www/seamonkey/files/patch-bug858919	Sat Nov 22 10:43:07 2014	(r1768)
@@ -0,0 +1,394 @@
+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
+--- mozilla/toolkit/components/alerts/nsAlertsService.cpp
++++ mozilla/toolkit/components/alerts/nsAlertsService.cpp
+@@ -100,10 +100,12 @@ 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, aData,
+-                                            IPC::Principal(aPrincipal));
++    rv = sysAlerts->ShowAlertNotification(aImageUrl, aAlertTitle, aAlertText, aAlertTextClickable,
++                                          aAlertCookie, aAlertListener, aAlertName,
++                                          aBidi, aLang, aData,
++                                          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
+--- mozilla/toolkit/system/gnome/moz.build
++++ mozilla/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
+--- mozilla/toolkit/system/gnome/nsAlertsIconListener.cpp
++++ mozilla/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
++++ mozilla/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
+--- mozilla/toolkit/system/gnome/nsGnomeModule.cpp
++++ mozilla/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
++++ mozilla/toolkit/system/gnome/nsSystemAlertsService.cpp
+@@ -0,0 +1,54 @@
++/* -*- 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,
++                                                           const nsAString & aData,
++                                                           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
++++ mozilla/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__ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201411221043.sAMAh76V083395>