/* -*- Mode: C++; tab-width: 4; 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 ToastNotificationHandler_h__ #define ToastNotificationHandler_h__ #include #include #include #include "nsCOMPtr.h" #include "nsICancelable.h" #include "nsIFile.h" #include "nsIWindowsAlertsService.h" #include "nsString.h" #include "mozilla/Result.h" namespace mozilla { namespace widget { enum class ImagePlacement { eInline, eHero, eIcon, }; class ToastNotification; class ToastNotificationHandler final : public nsIAlertNotificationImageListener { public: NS_DECL_ISUPPORTS NS_DECL_NSIALERTNOTIFICATIONIMAGELISTENER ToastNotificationHandler( ToastNotification* backend, const nsAString& aumid, nsIObserver* aAlertListener, const nsAString& aName, const nsAString& aCookie, const nsAString& aTitle, const nsAString& aMsg, const nsAString& aHostPort, bool aClickable, bool aRequireInteraction, const nsTArray>& aActions, bool aIsSystemPrincipal, const nsAString& aOpaqueRelaunchData, bool aInPrivateBrowsing, bool aIsSilent, bool aHandlesActions = false, ImagePlacement aImagePlacement = ImagePlacement::eInline) : mBackend(backend), mAumid(aumid), mHasImage(false), mAlertListener(aAlertListener), mName(aName), mCookie(aCookie), mTitle(aTitle), mMsg(aMsg), mHostPort(aHostPort), mClickable(aClickable), mRequireInteraction(aRequireInteraction), mInPrivateBrowsing(aInPrivateBrowsing), mActions(aActions.Clone()), mIsSystemPrincipal(aIsSystemPrincipal), mOpaqueRelaunchData(aOpaqueRelaunchData), mIsSilent(aIsSilent), mSentFinished(!aAlertListener), mHandleActions(aHandlesActions), mImagePlacement(aImagePlacement) {} nsresult InitAlertAsync(nsIAlertNotification* aAlert); void OnWriteImageFinished(nsresult rv); void HideAlert(); bool IsPrivate(); void UnregisterHandler(); nsString ActionArgsJSONString( const nsString& aAction, const nsString& aOpaqueRelaunchData /* = u""_ns */); nsresult CreateToastXmlString(const nsAString& aImageURL, nsAString& aString); nsresult GetWindowsTag(nsAString& aWindowsTag); nsresult SetWindowsTag(const nsAString& aWindowsTag); // Exposed for consumption by `ToastNotification.cpp`. static nsresult FindNotificationDataForWindowsTag( const nsAString& aWindowsTag, const nsAString& aAumid, bool& aFoundTag, nsAString& aNotificationData); protected: virtual ~ToastNotificationHandler(); using IXmlDocument = ABI::Windows::Data::Xml::Dom::IXmlDocument; using IToastNotifier = ABI::Windows::UI::Notifications::IToastNotifier; using IToastNotification = ABI::Windows::UI::Notifications::IToastNotification; using IToastDismissedEventArgs = ABI::Windows::UI::Notifications::IToastDismissedEventArgs; using IToastFailedEventArgs = ABI::Windows::UI::Notifications::IToastFailedEventArgs; using ToastTemplateType = ABI::Windows::UI::Notifications::ToastTemplateType; template using ComPtr = Microsoft::WRL::ComPtr; Result GetLaunchArgument(); ComPtr mNotification; ComPtr mNotifier; RefPtr mBackend; nsString mAumid; nsString mWindowsTag; nsCOMPtr mImageRequest; nsCOMPtr mImageFile; nsString mImageUri; bool mHasImage; EventRegistrationToken mActivatedToken; EventRegistrationToken mDismissedToken; EventRegistrationToken mFailedToken; nsCOMPtr mAlertListener; nsString mName; nsString mCookie; nsString mTitle; nsString mMsg; nsString mHostPort; bool mClickable; bool mRequireInteraction; bool mInPrivateBrowsing; nsTArray> mActions; bool mIsSystemPrincipal; nsString mOpaqueRelaunchData; bool mIsSilent; bool mSentFinished; bool mHandleActions; ImagePlacement mImagePlacement; nsresult TryShowAlert(); bool ShowAlert(); nsresult AsyncSaveImage(imgIRequest* aRequest); nsresult OnWriteImageSuccess(); void SendFinished(); nsresult InitWindowsTag(); bool CreateWindowsNotificationFromXml(ComPtr& aToastXml); ComPtr CreateToastXmlDocument(); HRESULT OnActivate(const ComPtr& notification, const ComPtr& inspectable); HRESULT OnDismiss(const ComPtr& notification, const ComPtr& aArgs); HRESULT OnFail(const ComPtr& notification, const ComPtr& aArgs); static ComPtr FindNotificationByTag( const nsAString& aWindowsTag, const nsAString& aAumid); }; } // namespace widget } // namespace mozilla #endif