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.h222
1 files changed, 222 insertions, 0 deletions
diff --git a/dom/base/nsContentPermissionHelper.h b/dom/base/nsContentPermissionHelper.h
new file mode 100644
index 0000000000..0884dd1593
--- /dev/null
+++ b/dom/base/nsContentPermissionHelper.h
@@ -0,0 +1,222 @@
+/* -*- 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 "mozilla/PermissionDelegateHandler.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;
+
+// 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 nsTArray<nsString>& aOptions);
+
+ protected:
+ virtual ~ContentPermissionType();
+
+ nsCString mType;
+ 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 nsTArray<nsString>& aOptions,
+ nsIArray** aTypesArray);
+
+ static PContentPermissionRequestParent* CreateContentPermissionRequestParent(
+ const nsTArray<PermissionRequest>& aRequests, Element* aElement,
+ nsIPrincipal* aPrincipal, nsIPrincipal* aTopLevelPrincipal,
+ const bool aIsHandlingUserInput,
+ const bool aMaybeUnsafePermissionDelegate, 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);
+};
+
+nsresult TranslateChoices(
+ JS::HandleValue aChoices,
+ const nsTArray<PermissionRequest>& aPermissionRequests,
+ nsTArray<PermissionChoice>& aTranslatedChoices);
+
+class ContentPermissionRequestBase : public nsIContentPermissionRequest {
+ public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS(ContentPermissionRequestBase)
+
+ NS_IMETHOD GetTypes(nsIArray** aTypes) override;
+ NS_IMETHOD GetPrincipal(nsIPrincipal** aPrincipal) override;
+ NS_IMETHOD GetDelegatePrincipal(const nsACString& aType,
+ nsIPrincipal** aPrincipal) override;
+ NS_IMETHOD GetTopLevelPrincipal(nsIPrincipal** aTopLevelPrincipal) override;
+ NS_IMETHOD GetWindow(mozIDOMWindow** aWindow) override;
+ NS_IMETHOD GetElement(mozilla::dom::Element** aElement) override;
+ NS_IMETHOD GetIsHandlingUserInput(bool* aIsHandlingUserInput) override;
+ NS_IMETHOD GetMaybeUnsafePermissionDelegate(
+ bool* aMaybeUnsafePermissionDelegate) override;
+ // Overrides for Allow() and Cancel() aren't provided by this class.
+ // That is the responsibility of the subclasses.
+
+ enum class PromptResult {
+ Granted,
+ Denied,
+ Pending,
+ };
+ nsresult ShowPrompt(PromptResult& aResult);
+
+ PromptResult CheckPromptPrefs();
+
+ // Check if the permission has an opportunity to request.
+ bool CheckPermissionDelegate();
+
+ enum class DelayedTaskType {
+ Allow,
+ Deny,
+ Request,
+ };
+ void RequestDelayedTask(nsIEventTarget* aTarget, DelayedTaskType aType);
+
+ protected:
+ ContentPermissionRequestBase(nsIPrincipal* aPrincipal,
+ nsPIDOMWindowInner* aWindow,
+ const nsACString& aPrefName,
+ const nsACString& aType);
+ virtual ~ContentPermissionRequestBase() = default;
+
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+ nsCOMPtr<nsIPrincipal> mTopLevelPrincipal;
+ nsCOMPtr<nsPIDOMWindowInner> mWindow;
+ RefPtr<PermissionDelegateHandler> mPermissionHandler;
+ nsCString mPrefName;
+ nsCString mType;
+ bool mIsHandlingUserInput;
+ bool mMaybeUnsafePermissionDelegate;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+using mozilla::dom::ContentPermissionRequestParent;
+
+class nsContentPermissionRequestProxy : public nsIContentPermissionRequest {
+ public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSICONTENTPERMISSIONREQUEST
+
+ explicit nsContentPermissionRequestProxy(
+ ContentPermissionRequestParent* parent);
+
+ nsresult Init(const nsTArray<mozilla::dom::PermissionRequest>& requests);
+
+ void OnParentDestroyed();
+
+ private:
+ virtual ~nsContentPermissionRequestProxy();
+
+ // Non-owning pointer to the ContentPermissionRequestParent object which owns
+ // this proxy.
+ ContentPermissionRequestParent* mParent;
+ nsTArray<mozilla::dom::PermissionRequest> mPermissionRequests;
+};
+
+/**
+ * RemotePermissionRequest will send a prompt ipdl request to b2g process.
+ */
+class RemotePermissionRequest final
+ : public mozilla::dom::PContentPermissionRequestChild {
+ public:
+ NS_INLINE_DECL_REFCOUNTING(RemotePermissionRequest)
+
+ RemotePermissionRequest(nsIContentPermissionRequest* aRequest,
+ nsPIDOMWindowInner* aWindow);
+
+ // It will be called when prompt dismissed. MOZ_CAN_RUN_SCRIPT_BOUNDARY
+ // because we don't have MOZ_CAN_RUN_SCRIPT bits in IPC code yet.
+ MOZ_CAN_RUN_SCRIPT_BOUNDARY
+ mozilla::ipc::IPCResult RecvNotifyResult(
+ const bool& aAllow, nsTArray<PermissionChoice>&& aChoices);
+
+ void IPDLAddRef() {
+ mIPCOpen = true;
+ AddRef();
+ }
+
+ void IPDLRelease() {
+ mIPCOpen = false;
+ Release();
+ }
+
+ void Destroy();
+
+ bool IPCOpen() const { return mIPCOpen && !mDestroyed; }
+
+ private:
+ virtual ~RemotePermissionRequest();
+
+ MOZ_CAN_RUN_SCRIPT
+ void DoAllow(JS::HandleValue aChoices);
+ MOZ_CAN_RUN_SCRIPT
+ void DoCancel();
+
+ nsCOMPtr<nsIContentPermissionRequest> mRequest;
+ nsCOMPtr<nsPIDOMWindowInner> mWindow;
+ bool mIPCOpen;
+ bool mDestroyed;
+};
+
+#endif // nsContentPermissionHelper_h