gecko-dev/dom/bindings/SimpleGlobalObject.h
Tom Ritter 4b30551afe Bug 1815307: Make all ShouldRFP functions take a RTPTarget r=timhuang
The default value for the target is Unknown, so all callsites
keep working.

We also add a Target value used for Document precomputation. This
value is enabled in RFP Lite mode, and allows us to precompute
ShouldRFP and cache it for faster computations later.  (The later
computations will still check the Target, but won't need to do the
other expensive checks.)

Differential Revision: https://phabricator.services.mozilla.com/D170891
2023-03-21 14:14:48 +00:00

97 lines
3.7 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/. */
/**
* A simplere nsIGlobalObject implementation that can be used to set up a new
* global without anything interesting in it other than the JS builtins. This
* is safe to use on both mainthread and worker threads.
*/
#ifndef mozilla_dom_SimpleGlobalObject_h__
#define mozilla_dom_SimpleGlobalObject_h__
#include "nsContentUtils.h"
#include "nsIGlobalObject.h"
#include "nsWrapperCache.h"
#include "js/TypeDecls.h"
#include "js/Value.h"
#include "nsISupportsImpl.h"
#include "nsCycleCollectionParticipant.h"
namespace mozilla::dom {
class SimpleGlobalObject : public nsIGlobalObject, public nsWrapperCache {
public:
enum class GlobalType {
BindingDetail, // Should only be used by DOM bindings code.
WorkerDebuggerSandbox,
NotSimpleGlobal // Sentinel to be used by BasicGlobalType.
};
// Create a new JS global object that can be used to do some work. This
// global will NOT have any DOM APIs exposed in it, will not be visible to the
// debugger, and will not have a useful concept of principals, so don't try to
// use it with any DOM objects. Apart from that, running code with
// side-effects is safe in this global. Importantly, when you are first
// handed this global it's guaranteed to have pristine built-ins. The
// corresponding nsIGlobalObject* for this global object will be a
// SimpleGlobalObject of the type provided; JS::GetPrivate on the returned
// JSObject* will return the SimpleGlobalObject*.
//
// If the provided prototype value is undefined, it is ignored. If it's an
// object or null, it's set as the prototype of the created global. If it's
// anything else, this function returns null.
//
// Note that creating new globals is not cheap and should not be done
// gratuitously. Please think carefully before you use this function.
static JSObject* Create(GlobalType globalType, JS::Handle<JS::Value> proto =
JS::UndefinedHandleValue);
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(SimpleGlobalObject)
// Gets the GlobalType of this SimpleGlobalObject.
GlobalType Type() const { return mType; }
// Gets the GlobalType of the SimpleGlobalObject for the given JSObject*, if
// the given JSObject* is the global corresponding to a SimpleGlobalObject.
// Oherwise, returns GlobalType::NotSimpleGlobal.
static GlobalType SimpleGlobalType(JSObject* obj);
JSObject* GetGlobalJSObject() override { return GetWrapper(); }
JSObject* GetGlobalJSObjectPreserveColor() const override {
return GetWrapperPreserveColor();
}
OriginTrials Trials() const override { return {}; }
JSObject* WrapObject(JSContext* cx,
JS::Handle<JSObject*> aGivenProto) override {
MOZ_CRASH("SimpleGlobalObject doesn't use DOM bindings!");
}
bool ShouldResistFingerprinting(
RFPTarget aTarget = RFPTarget::Unknown) const override {
return nsContentUtils::ShouldResistFingerprinting(
"Presently we don't have enough context to make an informed decision"
"on JS Sandboxes. See 1782853",
aTarget);
}
private:
SimpleGlobalObject(JSObject* global, GlobalType type) : mType(type) {
SetWrapper(global);
}
virtual ~SimpleGlobalObject() { MOZ_ASSERT(!GetWrapperMaybeDead()); }
const GlobalType mType;
};
} // namespace mozilla::dom
#endif /* mozilla_dom_SimpleGlobalObject_h__ */