diff options
Diffstat (limited to 'dom/base/nsContentPermissionHelper.h')
-rw-r--r-- | dom/base/nsContentPermissionHelper.h | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/dom/base/nsContentPermissionHelper.h b/dom/base/nsContentPermissionHelper.h new file mode 100644 index 000000000..af15744af --- /dev/null +++ b/dom/base/nsContentPermissionHelper.h @@ -0,0 +1,215 @@ +/* -*- 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 nsContentPermissionHelper_h +#define nsContentPermissionHelper_h + +#include "nsIContentPermissionPrompt.h" +#include "nsTArray.h" +#include "nsIMutableArray.h" +#include "mozilla/dom/PContentPermissionRequestChild.h" +#include "mozilla/dom/ipc/IdType.h" +#include "nsIDOMEventListener.h" + +// Microsoft's API Name hackery sucks +// XXXbz Doing this in a header is a gigantic footgun. See +// https://bugzilla.mozilla.org/show_bug.cgi?id=932421#c3 for why. +#undef LoadImage + +class nsPIDOMWindowInner; +class nsContentPermissionRequestProxy; +class VisibilityChangeListener; + +// Forward declare IPC::Principal here which is defined in +// PermissionMessageUtils.h. Include this file will transitively includes +// "windows.h" and it defines +// #define CreateEvent CreateEventW +// #define LoadImage LoadImageW +// That will mess up windows build. +namespace IPC { +class Principal; +} // namespace IPC + +namespace mozilla { +namespace dom { + +class Element; +class PermissionRequest; +class ContentPermissionRequestParent; +class PContentPermissionRequestParent; + +class ContentPermissionType : public nsIContentPermissionType +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSICONTENTPERMISSIONTYPE + + ContentPermissionType(const nsACString& aType, + const nsACString& aAccess, + const nsTArray<nsString>& aOptions); + +protected: + virtual ~ContentPermissionType(); + + nsCString mType; + nsCString mAccess; + nsTArray<nsString> mOptions; +}; + +class nsContentPermissionUtils +{ +public: + static uint32_t + ConvertPermissionRequestToArray(nsTArray<PermissionRequest>& aSrcArray, + nsIMutableArray* aDesArray); + + static uint32_t + ConvertArrayToPermissionRequest(nsIArray* aSrcArray, + nsTArray<PermissionRequest>& aDesArray); + + static nsresult + CreatePermissionArray(const nsACString& aType, + const nsACString& aAccess, + const nsTArray<nsString>& aOptions, + nsIArray** aTypesArray); + + static PContentPermissionRequestParent* + CreateContentPermissionRequestParent(const nsTArray<PermissionRequest>& aRequests, + Element* element, + const IPC::Principal& principal, + const TabId& aTabId); + + static nsresult + AskPermission(nsIContentPermissionRequest* aRequest, + nsPIDOMWindowInner* aWindow); + + static nsTArray<PContentPermissionRequestParent*> + GetContentPermissionRequestParentById(const TabId& aTabId); + + static void + NotifyRemoveContentPermissionRequestParent(PContentPermissionRequestParent* aParent); + + static nsTArray<PContentPermissionRequestChild*> + GetContentPermissionRequestChildById(const TabId& aTabId); + + static void + NotifyRemoveContentPermissionRequestChild(PContentPermissionRequestChild* aChild); +}; + +class nsContentPermissionRequester final : public nsIContentPermissionRequester +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSICONTENTPERMISSIONREQUESTER + + explicit nsContentPermissionRequester(nsPIDOMWindowInner* aWindow); + +private: + virtual ~nsContentPermissionRequester(); + + nsWeakPtr mWindow; + RefPtr<VisibilityChangeListener> mListener; +}; + +} // namespace dom +} // namespace mozilla + +using mozilla::dom::ContentPermissionRequestParent; + +class nsContentPermissionRequestProxy : public nsIContentPermissionRequest +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSICONTENTPERMISSIONREQUEST + + nsContentPermissionRequestProxy(); + + nsresult Init(const nsTArray<mozilla::dom::PermissionRequest>& requests, + ContentPermissionRequestParent* parent); + + void OnParentDestroyed(); + + void NotifyVisibility(const bool& aIsVisible); + +private: + class nsContentPermissionRequesterProxy final : public nsIContentPermissionRequester { + public: + NS_DECL_ISUPPORTS + NS_DECL_NSICONTENTPERMISSIONREQUESTER + + explicit nsContentPermissionRequesterProxy(ContentPermissionRequestParent* aParent) + : mParent(aParent) + , mWaitGettingResult(false) {} + + void NotifyVisibilityResult(const bool& aIsVisible); + + private: + virtual ~nsContentPermissionRequesterProxy() {} + + ContentPermissionRequestParent* mParent; + bool mWaitGettingResult; + nsCOMPtr<nsIContentPermissionRequestCallback> mGetCallback; + nsCOMPtr<nsIContentPermissionRequestCallback> mOnChangeCallback; + }; + + virtual ~nsContentPermissionRequestProxy(); + + // Non-owning pointer to the ContentPermissionRequestParent object which owns this proxy. + ContentPermissionRequestParent* mParent; + nsTArray<mozilla::dom::PermissionRequest> mPermissionRequests; + RefPtr<nsContentPermissionRequesterProxy> mRequester; +}; + +/** + * RemotePermissionRequest will send a prompt ipdl request to b2g process. + */ +class RemotePermissionRequest final : public nsIContentPermissionRequestCallback + , public mozilla::dom::PContentPermissionRequestChild +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSICONTENTPERMISSIONREQUESTCALLBACK + + RemotePermissionRequest(nsIContentPermissionRequest* aRequest, + nsPIDOMWindowInner* aWindow); + + // It will be called when prompt dismissed. + virtual bool RecvNotifyResult(const bool &aAllow, + InfallibleTArray<PermissionChoice>&& aChoices) override; + + virtual bool RecvGetVisibility() override; + + void IPDLAddRef() + { + mIPCOpen = true; + AddRef(); + } + + void IPDLRelease() + { + mIPCOpen = false; + Release(); + } + + void Destroy(); + + bool IPCOpen() const { return mIPCOpen && !mDestroyed; } + +private: + virtual ~RemotePermissionRequest(); + + void DoAllow(JS::HandleValue aChoices); + void DoCancel(); + + nsCOMPtr<nsIContentPermissionRequest> mRequest; + nsCOMPtr<nsPIDOMWindowInner> mWindow; + bool mIPCOpen; + bool mDestroyed; + RefPtr<VisibilityChangeListener> mListener; +}; + +#endif // nsContentPermissionHelper_h + |