mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-09 01:08:39 +09:00
In order to tailor certain security checks to the caller that is attempting to load a particular piece of content, we need to be able to attach an appropriate triggering principal to the corresponding requests. Since most HTML content is loaded based on attribute values, this means capturing the subject principal of the caller who sets those attributes, which in turn means we need to make it available to `AfterSetAttr` hooks on all relevant element types.
129 lines
4.5 KiB
C++
129 lines
4.5 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* 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 mozilla_dom_SVGAnimationElement_h
|
|
#define mozilla_dom_SVGAnimationElement_h
|
|
|
|
#include "mozilla/Attributes.h"
|
|
#include "mozilla/dom/SVGTests.h"
|
|
#include "nsReferencedElement.h"
|
|
#include "nsSMILTimedElement.h"
|
|
#include "nsSVGElement.h"
|
|
|
|
typedef nsSVGElement SVGAnimationElementBase;
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
enum nsSMILTargetAttrType {
|
|
eSMILTargetAttrType_auto,
|
|
eSMILTargetAttrType_CSS,
|
|
eSMILTargetAttrType_XML
|
|
};
|
|
|
|
class SVGAnimationElement : public SVGAnimationElementBase,
|
|
public SVGTests
|
|
{
|
|
protected:
|
|
explicit SVGAnimationElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);
|
|
nsresult Init();
|
|
virtual ~SVGAnimationElement();
|
|
|
|
public:
|
|
// interfaces:
|
|
NS_DECL_ISUPPORTS_INHERITED
|
|
|
|
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SVGAnimationElement,
|
|
SVGAnimationElementBase)
|
|
|
|
virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const override = 0;
|
|
|
|
// nsIContent specializations
|
|
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|
nsIContent* aBindingParent,
|
|
bool aCompileEventHandlers) override;
|
|
virtual void UnbindFromTree(bool aDeep, bool aNullParent) override;
|
|
|
|
virtual nsresult UnsetAttr(int32_t aNamespaceID, nsIAtom* aAttribute,
|
|
bool aNotify) override;
|
|
|
|
virtual bool IsNodeOfType(uint32_t aFlags) const override;
|
|
|
|
// Element specializations
|
|
virtual bool ParseAttribute(int32_t aNamespaceID,
|
|
nsIAtom* aAttribute,
|
|
const nsAString& aValue,
|
|
nsAttrValue& aResult) override;
|
|
virtual nsresult AfterSetAttr(int32_t aNamespaceID, nsIAtom* aName,
|
|
const nsAttrValue* aValue,
|
|
const nsAttrValue* aOldValue,
|
|
nsIPrincipal* aSubjectPrincipal,
|
|
bool aNotify) override;
|
|
|
|
const nsAttrValue* GetAnimAttr(nsIAtom* aName) const;
|
|
bool GetAnimAttr(nsIAtom* aAttName, nsAString& aResult) const;
|
|
bool HasAnimAttr(nsIAtom* aAttName) const;
|
|
Element* GetTargetElementContent();
|
|
virtual bool GetTargetAttributeName(int32_t* aNamespaceID,
|
|
nsIAtom** aLocalName) const;
|
|
virtual nsSMILTargetAttrType GetTargetAttributeType() const;
|
|
nsSMILTimedElement& TimedElement();
|
|
nsSMILTimeContainer* GetTimeContainer();
|
|
virtual nsSMILAnimationFunction& AnimationFunction() = 0;
|
|
|
|
virtual bool IsEventAttributeName(nsIAtom* aName) override;
|
|
|
|
// Utility methods for within SVG
|
|
void ActivateByHyperlink();
|
|
|
|
// WebIDL
|
|
nsSVGElement* GetTargetElement();
|
|
float GetStartTime(ErrorResult& rv);
|
|
float GetCurrentTime();
|
|
float GetSimpleDuration(ErrorResult& rv);
|
|
void BeginElement(ErrorResult& rv) { BeginElementAt(0.f, rv); }
|
|
void BeginElementAt(float offset, ErrorResult& rv);
|
|
void EndElement(ErrorResult& rv) { EndElementAt(0.f, rv); }
|
|
void EndElementAt(float offset, ErrorResult& rv);
|
|
|
|
// SVGTests
|
|
virtual bool IsInChromeDoc() const override;
|
|
|
|
|
|
protected:
|
|
// nsSVGElement overrides
|
|
|
|
void UpdateHrefTarget(nsIContent* aNodeForContext,
|
|
const nsAString& aHrefStr);
|
|
void AnimationTargetChanged();
|
|
|
|
class TargetReference : public nsReferencedElement {
|
|
public:
|
|
explicit TargetReference(SVGAnimationElement* aAnimationElement) :
|
|
mAnimationElement(aAnimationElement) {}
|
|
protected:
|
|
// We need to be notified when target changes, in order to request a
|
|
// sample (which will clear animation effects from old target and apply
|
|
// them to the new target) and update any event registrations.
|
|
virtual void ElementChanged(Element* aFrom, Element* aTo) override {
|
|
nsReferencedElement::ElementChanged(aFrom, aTo);
|
|
mAnimationElement->AnimationTargetChanged();
|
|
}
|
|
|
|
// We need to override IsPersistent to get persistent tracking (beyond the
|
|
// first time the target changes)
|
|
virtual bool IsPersistent() override { return true; }
|
|
private:
|
|
SVGAnimationElement* const mAnimationElement;
|
|
};
|
|
|
|
TargetReference mHrefTarget;
|
|
nsSMILTimedElement mTimedElement;
|
|
};
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_dom_SVGAnimationElement_h
|