Files
palemoon27/dom/base/nsContentPermissionHelper.h
T
roytam1 19b122873d import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1240985 - Always enqueue OnMaybeDequeueOne task when receiving a message (r=dvander) (a5056d5942)
- Bug 1240985 - Null out mRecvd if message it corresponds to is cancelled (r=dvander) (3eb16e50b4)
- Bug 1245649: Merge browser and toolkit eslint rule settings. r=felipe (fb8837edb9)
- Bug 1189799 - Make sure that about:performance displays each add-on only once (more tests);r=felipe (67cc74db67)
- Bug 1230471 - Basic eslint fixes in places. r=mconley (1460c46edc)
- Bug 1142734: Allow unloading the loader sandbox module. r=jsantell (052f483a6d)
- Bug 1047595 - make picking colors work in HCM / when author colors are disabled, r=jaws (728163434b)
- Bug 1244647 fix typeof check, r=mikedeboer (72da15da21)
- Bug 1229240 - make applyConstraints() reject instead of crash on non-gUM tracks. r=jesup (93d2abf43a)
- Bug 1239893 - Add gonk SidebandStream handling to DOMHwMediaStream r=roc (86739bc7a4)
- Bug 1189162 - Clamp gamepad.timestamp and VideoPlaybackQuality.creationTime. r=bz (daaa3cc0db)
- Bug 1232348 - adjust nested-frame checking condition. r=baku. (e4d1930bef)
- Bug 1166556 - Don't start geolocation provider if the cached position is being used. r=jdm (3ad2c5dfa9)
- Bug 858827 - [Geolocation] Add a handling for getCurrentLocation when timeout is zero. r=jdm (63dd4ccaf3)
- Bug 1216148 - Handle how geolocation acts when the app's visibility changes. r=kchen. (dbeb9ef51c)
- Bug 1230209 - Add more telemetry for Geolocation usage f=bsmedberg r=tanvi,rbarnes,jdm (c32b195d25)
- Bug 1238825: Add "dom.bluetooth.webbluetooth.enabled" preference for WebBluetooth API development. r=btian, r=bz (3298be0b87)
- Bug 1223722: Transfer Bluetooth addresses in |BluetoothValue|, r=brsun (1cc507823b)
- Bug 1223722: Transfer Bluetooth remote names in |BluetoothValue|, r=brsun (73a008b991)
- Bug 789315, notify MutationObservers before running <script>, r=khuey (d2df797c54)
- Bug 1214495 - Move CallerSubsumes checks in nsLocation into the WebIDL entry points. r=bz (69a2086836)
- Bug 1239509: Move VisibilityChangeListener out of nsContentPermissionHelper's header. r=wchen (bb2e33a40c)
- Bug 1183845 - Only send activation event if document is non-null. r=bz (4b81c3295d)
- Bug 1208789, clear starting node before traversing backwards by document, r=smaug (94a6cdd891)
- Bug 1240908 - Make the window reference in nsContentPermissionRequester weak. r=smaug (b5982ecb9e)
- Bug 1234735 - Remove redundant spaces in nsGlobalWindow. r=baku (5f55b37486)
- Bug 1180525. Run callbacks whose window is no longer current as long as its document is the active document in the browsing context. r=bholley (02e6d97a7b)
2023-11-08 16:38:54 +08:00

215 lines
6.2 KiB
C++

/* -*- 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 nsPIDOMWindow;
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, nsPIDOMWindow* 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(nsPIDOMWindow* 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,
nsPIDOMWindow* 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<nsPIDOMWindow> mWindow;
bool mIPCOpen;
bool mDestroyed;
RefPtr<VisibilityChangeListener> mListener;
};
#endif // nsContentPermissionHelper_h