summaryrefslogtreecommitdiffstats
path: root/dom/base/nsContentPermissionHelper.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/nsContentPermissionHelper.h')
-rw-r--r--dom/base/nsContentPermissionHelper.h215
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
+