1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
/* -*- 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 https://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_worklet_WorkletImpl_h
#define mozilla_dom_worklet_WorkletImpl_h
#include "MainThreadUtils.h"
#include "mozilla/BasePrincipal.h"
#include "mozilla/Maybe.h"
#include "mozilla/OriginAttributes.h"
#include "mozilla/OriginTrials.h"
#include "mozilla/ipc/PBackgroundSharedTypes.h"
#include "nsRFPService.h"
class nsPIDOMWindowInner;
class nsIPrincipal;
class nsIRunnable;
namespace mozilla {
namespace dom {
class Worklet;
class WorkletGlobalScope;
class WorkletThread;
} // namespace dom
class WorkletLoadInfo {
public:
explicit WorkletLoadInfo(nsPIDOMWindowInner* aWindow);
uint64_t OuterWindowID() const { return mOuterWindowID; }
uint64_t InnerWindowID() const { return mInnerWindowID; }
private:
// Modified only in constructor.
uint64_t mOuterWindowID;
const uint64_t mInnerWindowID;
};
/**
* WorkletImpl is accessed from both the worklet's parent thread (on which the
* Worklet object lives) and the worklet's execution thread. It is owned by
* Worklet and WorkletGlobalScope. No parent thread cycle collected objects
* are owned indefinitely by WorkletImpl because WorkletImpl is not cycle
* collected.
*/
class WorkletImpl {
using RFPTarget = mozilla::RFPTarget;
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WorkletImpl);
// Methods for parent thread only:
virtual JSObject* WrapWorklet(JSContext* aCx, dom::Worklet* aWorklet,
JS::Handle<JSObject*> aGivenProto);
virtual nsresult SendControlMessage(already_AddRefed<nsIRunnable> aRunnable);
void NotifyWorkletFinished();
virtual nsContentPolicyType ContentPolicyType() const = 0;
// Execution thread only.
dom::WorkletGlobalScope* GetGlobalScope();
// Any thread.
const OriginTrials& Trials() const { return mTrials; }
const WorkletLoadInfo& LoadInfo() const { return mWorkletLoadInfo; }
const OriginAttributes& OriginAttributesRef() const {
return mPrincipal->OriginAttributesRef();
}
nsIPrincipal* Principal() const { return mPrincipal; }
const ipc::PrincipalInfo& PrincipalInfo() const { return mPrincipalInfo; }
const Maybe<nsID>& GetAgentClusterId() const { return mAgentClusterId; }
bool IsSharedMemoryAllowed() const { return mSharedMemoryAllowed; }
bool IsSystemPrincipal() const { return mPrincipal->IsSystemPrincipal(); }
bool ShouldResistFingerprinting(RFPTarget aTarget) const {
return mShouldResistFingerprinting &&
nsRFPService::IsRFPEnabledFor(mIsPrivateBrowsing, aTarget,
mOverriddenFingerprintingSettings);
}
virtual void OnAddModuleStarted() const {
MOZ_ASSERT(NS_IsMainThread());
// empty base impl
}
virtual void OnAddModulePromiseSettled() const {
MOZ_ASSERT(NS_IsMainThread());
// empty base impl
}
protected:
WorkletImpl(nsPIDOMWindowInner* aWindow, nsIPrincipal* aPrincipal);
virtual ~WorkletImpl();
virtual already_AddRefed<dom::WorkletGlobalScope> ConstructGlobalScope(
JSContext* aCx) = 0;
// Modified only in constructor.
ipc::PrincipalInfo mPrincipalInfo;
nsCOMPtr<nsIPrincipal> mPrincipal;
const WorkletLoadInfo mWorkletLoadInfo;
// Parent thread only.
RefPtr<dom::WorkletThread> mWorkletThread;
bool mTerminated : 1;
// Execution thread only.
RefPtr<dom::WorkletGlobalScope> mGlobalScope;
bool mFinishedOnExecutionThread : 1;
Maybe<nsID> mAgentClusterId;
bool mSharedMemoryAllowed : 1;
bool mShouldResistFingerprinting : 1;
bool mIsPrivateBrowsing : 1;
// The granular fingerprinting protection overrides applied to the worklet.
// This will only get populated if these is one that comes from the local
// granular override pref or WebCompat. Otherwise, a value of Nothing()
// indicates no granular overrides are present for this workerlet.
Maybe<RFPTargetSet> mOverriddenFingerprintingSettings;
const OriginTrials mTrials;
};
} // namespace mozilla
#endif // mozilla_dom_worklet_WorkletImpl_h
|