diff options
Diffstat (limited to 'dom/security/trusted-types/TrustedTypePolicyFactory.cpp')
-rw-r--r-- | dom/security/trusted-types/TrustedTypePolicyFactory.cpp | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/dom/security/trusted-types/TrustedTypePolicyFactory.cpp b/dom/security/trusted-types/TrustedTypePolicyFactory.cpp index 448c51eb3b..c2544124e3 100644 --- a/dom/security/trusted-types/TrustedTypePolicyFactory.cpp +++ b/dom/security/trusted-types/TrustedTypePolicyFactory.cpp @@ -22,10 +22,50 @@ JSObject* TrustedTypePolicyFactory::WrapObject( already_AddRefed<TrustedTypePolicy> TrustedTypePolicyFactory::CreatePolicy( const nsAString& aPolicyName, const TrustedTypePolicyOptions& aPolicyOptions) { - // TODO: implement the spec. - return MakeRefPtr<TrustedTypePolicy>(this).forget(); + // TODO: add CSP support. + + // TODO: add default policy support; this requires accessing the default + // policy on the C++ side, hence already now ref-counting policy + // objects. + + TrustedTypePolicy::Options options; + + if (aPolicyOptions.mCreateHTML.WasPassed()) { + options.mCreateHTMLCallback = &aPolicyOptions.mCreateHTML.Value(); + } + + if (aPolicyOptions.mCreateScript.WasPassed()) { + options.mCreateScriptCallback = &aPolicyOptions.mCreateScript.Value(); + } + + if (aPolicyOptions.mCreateScriptURL.WasPassed()) { + options.mCreateScriptURLCallback = &aPolicyOptions.mCreateScriptURL.Value(); + } + + RefPtr<TrustedTypePolicy> policy = + MakeRefPtr<TrustedTypePolicy>(this, aPolicyName, std::move(options)); + + mCreatedPolicyNames.AppendElement(aPolicyName); + + return policy.forget(); } +#define IS_TRUSTED_TYPE_IMPL(_trustedTypeSuffix) \ + bool TrustedTypePolicyFactory::Is##_trustedTypeSuffix( \ + JSContext*, const JS::Handle<JS::Value>& aValue) const { \ + /** \ + * No need to check the internal slot. \ + * Ensured by the corresponding test: \ + * <https://searchfox.org/mozilla-central/rev/b60cb73160843adb5a5a3ec8058e75a69b46acf7/testing/web-platform/tests/trusted-types/TrustedTypePolicyFactory-isXXX.html> \ + */ \ + return aValue.isObject() && \ + IS_INSTANCE_OF(Trusted##_trustedTypeSuffix, &aValue.toObject()); \ + } + +IS_TRUSTED_TYPE_IMPL(HTML); +IS_TRUSTED_TYPE_IMPL(Script); +IS_TRUSTED_TYPE_IMPL(ScriptURL); + UniquePtr<TrustedHTML> TrustedTypePolicyFactory::EmptyHTML() { // Preserving the wrapper ensures: // ``` @@ -37,14 +77,14 @@ UniquePtr<TrustedHTML> TrustedTypePolicyFactory::EmptyHTML() { // multiple emptyHML objects. Both, the JS- and the C++-objects. dom::PreserveWrapper(this); - return MakeUnique<TrustedHTML>(); + return MakeUnique<TrustedHTML>(EmptyString()); } UniquePtr<TrustedScript> TrustedTypePolicyFactory::EmptyScript() { // See the explanation in `EmptyHTML()`. dom::PreserveWrapper(this); - return MakeUnique<TrustedScript>(); + return MakeUnique<TrustedScript>(EmptyString()); } } // namespace mozilla::dom |