summaryrefslogtreecommitdiff
path: root/dom/notification/DesktopNotification.h
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commitad18d877ddd2a44d98fa12ccd3dbbcf4d0ac4299 (patch)
tree10027f336435511475e392454359edea8e25895d /dom/notification/DesktopNotification.h
parent15477ed9af4859dacb069040b5d4de600803d3bc (diff)
downloadaura-central-ad18d877ddd2a44d98fa12ccd3dbbcf4d0ac4299.tar.gz
Add m-esr52 at 52.6.0
Diffstat (limited to 'dom/notification/DesktopNotification.h')
-rw-r--r--dom/notification/DesktopNotification.h180
1 files changed, 180 insertions, 0 deletions
diff --git a/dom/notification/DesktopNotification.h b/dom/notification/DesktopNotification.h
new file mode 100644
index 000000000..e1cb2efbc
--- /dev/null
+++ b/dom/notification/DesktopNotification.h
@@ -0,0 +1,180 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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 mozilla_dom_DesktopNotification_h
+#define mozilla_dom_DesktopNotification_h
+
+#include "nsIPrincipal.h"
+#include "nsIAlertsService.h"
+#include "nsIContentPermissionPrompt.h"
+
+#include "nsIObserver.h"
+#include "nsString.h"
+#include "nsWeakPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsIDOMWindow.h"
+#include "nsIScriptObjectPrincipal.h"
+
+#include "nsIDOMEvent.h"
+
+#include "mozilla/Attributes.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/ErrorResult.h"
+#include "nsWrapperCache.h"
+
+
+namespace mozilla {
+namespace dom {
+
+class AlertServiceObserver;
+class DesktopNotification;
+
+/*
+ * DesktopNotificationCenter
+ * Object hangs off of the navigator object and hands out DesktopNotification objects
+ */
+class DesktopNotificationCenter final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DesktopNotificationCenter)
+
+ explicit DesktopNotificationCenter(nsPIDOMWindowInner* aWindow)
+ {
+ MOZ_ASSERT(aWindow);
+ mOwner = aWindow;
+
+ nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(aWindow);
+ MOZ_ASSERT(sop);
+
+ mPrincipal = sop->GetPrincipal();
+ MOZ_ASSERT(mPrincipal);
+ }
+
+ void Shutdown() {
+ mOwner = nullptr;
+ }
+
+ nsPIDOMWindowInner* GetParentObject() const
+ {
+ return mOwner;
+ }
+
+ virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ already_AddRefed<DesktopNotification>
+ CreateNotification(const nsAString& title,
+ const nsAString& description,
+ const nsAString& iconURL);
+
+private:
+ virtual ~DesktopNotificationCenter()
+ {
+ }
+
+ nsCOMPtr<nsPIDOMWindowInner> mOwner;
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+};
+
+class DesktopNotificationRequest;
+
+class DesktopNotification final : public DOMEventTargetHelper
+{
+ friend class DesktopNotificationRequest;
+
+public:
+
+ DesktopNotification(const nsAString& aTitle,
+ const nsAString& aDescription,
+ const nsAString& aIconURL,
+ nsPIDOMWindowInner* aWindow,
+ nsIPrincipal* principal);
+
+ virtual ~DesktopNotification();
+
+ void Init();
+
+ /*
+ * PostDesktopNotification
+ * Uses alert service to display a notification
+ */
+ nsresult PostDesktopNotification();
+
+ nsresult SetAllow(bool aAllow);
+
+ /*
+ * Creates and dispatches a dom event of type aName
+ */
+ void DispatchNotificationEvent(const nsString& aName);
+
+ void HandleAlertServiceNotification(const char *aTopic);
+
+ // WebIDL
+
+ nsPIDOMWindowInner* GetParentObject() const
+ {
+ return GetOwner();
+ }
+
+ virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void Show(ErrorResult& aRv);
+
+ IMPL_EVENT_HANDLER(click)
+ IMPL_EVENT_HANDLER(close)
+
+protected:
+
+ nsString mTitle;
+ nsString mDescription;
+ nsString mIconURL;
+
+ RefPtr<AlertServiceObserver> mObserver;
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+ bool mAllow;
+ bool mShowHasBeenCalled;
+
+ static uint32_t sCount;
+};
+
+class AlertServiceObserver: public nsIObserver
+{
+ public:
+ NS_DECL_ISUPPORTS
+
+ explicit AlertServiceObserver(DesktopNotification* notification)
+ : mNotification(notification) {}
+
+ void Disconnect() { mNotification = nullptr; }
+
+ NS_IMETHOD
+ Observe(nsISupports* aSubject,
+ const char* aTopic,
+ const char16_t* aData) override
+ {
+
+ // forward to parent
+ if (mNotification) {
+#ifdef MOZ_B2G
+ if (NS_FAILED(mNotification->CheckInnerWindowCorrectness()))
+ return NS_ERROR_NOT_AVAILABLE;
+#endif
+ mNotification->HandleAlertServiceNotification(aTopic);
+ }
+ return NS_OK;
+ };
+
+ private:
+ virtual ~AlertServiceObserver() {}
+
+ DesktopNotification* mNotification;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif /* mozilla_dom_DesktopNotification_h */