diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | ad18d877ddd2a44d98fa12ccd3dbbcf4d0ac4299 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /dom/notification/DesktopNotification.h | |
parent | 15477ed9af4859dacb069040b5d4de600803d3bc (diff) | |
download | aura-central-ad18d877ddd2a44d98fa12ccd3dbbcf4d0ac4299.tar.gz |
Add m-esr52 at 52.6.0
Diffstat (limited to 'dom/notification/DesktopNotification.h')
-rw-r--r-- | dom/notification/DesktopNotification.h | 180 |
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 */ |