/* -*- 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/. */#include"mozilla/ArrayUtils.h"#include"nsCOMPtr.h"#include"mozilla/dom/SVGDocument.h"#include"mozilla/dom/SVGForeignObjectElement.h"#include"mozilla/dom/SVGForeignObjectElementBinding.h"NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(ForeignObject)namespacemozilla{namespacedom{JSObject*SVGForeignObjectElement::WrapNode(JSContext*aCx,JS::Handle<JSObject*>aGivenProto){returnSVGForeignObjectElementBinding::Wrap(aCx,this,aGivenProto);}nsSVGElement::LengthInfoSVGForeignObjectElement::sLengthInfo[4]={{&nsGkAtoms::x,0,nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER,SVGContentUtils::X},{&nsGkAtoms::y,0,nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER,SVGContentUtils::Y},{&nsGkAtoms::width,0,nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER,SVGContentUtils::X},{&nsGkAtoms::height,0,nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER,SVGContentUtils::Y},};//----------------------------------------------------------------------// ImplementationSVGForeignObjectElement::SVGForeignObjectElement(already_AddRefed<mozilla::dom::NodeInfo>&aNodeInfo):SVGGraphicsElement(aNodeInfo){}//----------------------------------------------------------------------// nsIDOMNode methodsNS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGForeignObjectElement)//----------------------------------------------------------------------already_AddRefed<SVGAnimatedLength>SVGForeignObjectElement::X(){returnmLengthAttributes[ATTR_X].ToDOMAnimatedLength(this);}already_AddRefed<SVGAnimatedLength>SVGForeignObjectElement::Y(){returnmLengthAttributes[ATTR_Y].ToDOMAnimatedLength(this);}already_AddRefed<SVGAnimatedLength>SVGForeignObjectElement::Width(){returnmLengthAttributes[ATTR_WIDTH].ToDOMAnimatedLength(this);}already_AddRefed<SVGAnimatedLength>SVGForeignObjectElement::Height(){returnmLengthAttributes[ATTR_HEIGHT].ToDOMAnimatedLength(this);}//----------------------------------------------------------------------// nsSVGElement methods/* virtual */gfxMatrixSVGForeignObjectElement::PrependLocalTransformsTo(constgfxMatrix&aMatrix,SVGTransformTypesaWhich)const{// 'transform' attribute:gfxMatrixfromUserSpace=SVGGraphicsElement::PrependLocalTransformsTo(aMatrix,aWhich);if(aWhich==eUserSpaceToParent){returnfromUserSpace;}// our 'x' and 'y' attributes:floatx,y;const_cast<SVGForeignObjectElement*>(this)->GetAnimatedLengthValues(&x,&y,nullptr);gfxMatrixtoUserSpace=gfxMatrix::Translation(x,y);if(aWhich==eChildToUserSpace){returntoUserSpace*aMatrix;}MOZ_ASSERT(aWhich==eAllTransforms,"Unknown TransformTypes");returntoUserSpace*fromUserSpace;}/* virtual */boolSVGForeignObjectElement::HasValidDimensions()const{returnmLengthAttributes[ATTR_WIDTH].IsExplicitlySet()&&mLengthAttributes[ATTR_WIDTH].GetAnimValInSpecifiedUnits()>0&&mLengthAttributes[ATTR_HEIGHT].IsExplicitlySet()&&mLengthAttributes[ATTR_HEIGHT].GetAnimValInSpecifiedUnits()>0;}//----------------------------------------------------------------------// nsIContent methodsnsresultSVGForeignObjectElement::BindToTree(nsIDocument*aDocument,nsIContent*aParent,nsIContent*aBindingParent,boolaCompileEventHandlers){nsresultrv=SVGGraphicsElement::BindToTree(aDocument,aParent,aBindingParent,aCompileEventHandlers);NS_ENSURE_SUCCESS(rv,rv);nsIDocument*doc=GetComposedDoc();if(doc&&doc->IsSVGDocument()){// We assume that we're going to have HTML content, so we ensure that the// UA style sheets that nsDocumentViewer::CreateStyleSet skipped when// it saw the document was an SVG document are loaded.//// We setup these style sheets during binding, not element construction,// because elements can be moved from the document that creates them to// another document.doc->AsSVGDocument()->EnsureNonSVGUserAgentStyleSheetsLoaded();}returnrv;}NS_IMETHODIMP_(bool)SVGForeignObjectElement::IsAttributeMapped(constnsIAtom*name)const{staticconstMappedAttributeEntry*constmap[]={sFEFloodMap,sFiltersMap,sFontSpecificationMap,sGradientStopMap,sLightingEffectsMap,sMarkersMap,sTextContentElementsMap,sViewportsMap};returnFindAttributeDependence(name,map)||SVGGraphicsElement::IsAttributeMapped(name);}//----------------------------------------------------------------------// nsSVGElement methodsnsSVGElement::LengthAttributesInfoSVGForeignObjectElement::GetLengthInfo(){returnLengthAttributesInfo(mLengthAttributes,sLengthInfo,ArrayLength(sLengthInfo));}}// namespace dom}// namespace mozilla