Proposals/IDL interface reorganization
Removal of interface multiple inheritance
Incorporate SVGLangSpace into SVGElement
interface SVGElement { // Existing members: attribute DOMString xmlbase; readonly attribute SVGSVGElement ownerSVGElement; readonly attribute SVGElement viewportElement; // removed "id", since that is now in DOM Core // From SVGLangSpace: attribute DOMString xmllang; attribute DOMString xmlspace; };
Use primary interfaces for "stylable", "locatable" and "transformable"
interface SVGStylableElement : SVGElement { // Existing members of SVGStylable: readonly attribute SVGAnimatedString className; readonly attribute CSSStyleDeclaration style; CSSValue getPresentationAttribute(DOMString name); };
Should all elements by stylable?
[GA] What is the difference between getPresentationAttribute(name) and style.getPropertyCSSValue(name)? I also note that getPresentationAttribute indicates this method is deprecated.
interface SVGLocatableElement : SVGStylableElement { readonly attribute SVGElement nearestViewportElement; readonly attribute SVGElement farthestViewportElement; SVGRect getBBox(); SVGMatrix getCTM(); SVGMatrix getScreenCTM(); SVGMatrix getTransformToElement(SVGElement element); };
interface SVGTransformableElement : SVGLocatableElement { // Existing member of SVGTransformable: readonly attribute SVGAnimatedTransformList transform; };
In SVG 1.1, all elements that are transformable are stylable already.
In SVG 1.1, the only element that is locatable but not transformable is <svg>
, but we are planning on allowing transform=""
on <svg>
- ISSUE-2252.
Introduce some intermediate interfaces
// Things that render. interface SVGGraphicsElement : SVGTransformableElement { }; interface SVGRectElement : SVGGraphicsElement { ... }; interface SVGSVGElement : SVGGraphicsElement { ... }; interface SVGForeignObjectElement : SVGGraphicsElement { ... }; ...
// Things that only define something graphical. interface SVGDefinitionElement : SVGStylableElement { }; interface SVGFilterElement : SVGDefinitionElement { ... }; interface SVGGradientElement : SVGDefinitionElement { ... }; interface SVGMaskElement : SVGDefinitionElement { ... }; interface SVGSymbolElement : SVGDefinitionElement { ... }; ...
Having these two interfaces gives us a place to mix in other common interfaces (like SVGTests) without having to do it on each sub-interface.
Text interfaces
interface SVGTextContentElement : SVGGraphicsElement { ... }; interface SVGTextPositioningElement : SVGTextContentElement { ... }; interface SVGTextElement : SVGTextPositioningElement { ... }; interface SVGTSpanElement : SVGTextPositioningElement { ... }; interface SVGTextPathElement : SVGTextContentElement { ... };
Note that this allows transform=""
on text children, which we have planned to do.
Although I think we should merge the two interfaces, and allow positioning attributes on <textPath>
.
Use [NoInterfaceObject]
for other element mixin interfaces
[NoInterfaceObject] interface SVGExternalResourcesRequired { readonly attribute SVGAnimatedBoolean externalResourcesRequired; };
(Can we in fact get rid of externalResourcesRequired=""
altogether?)
[NoInterfaceObject] interface SVGTests { readonly attribute SVGStringList requiredFeatures; readonly attribute SVGStringList requiredExtensions; readonly attribute SVGStringList systemLanguage; boolean hasExtension(DOMString); }; SVGGraphicsElement implements SVGTests; SVGDefinitionElement implements SVGTests; SVGAnimationElement implements SVGTests;
[NoInterfaceObject] interface SVGFitToViewBox { readonly attribute SVGAnimatedRect viewBox; readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; }; SVGSVGElement implements SVGFitToViewBox; SVGMarkerElement implements SVGFitToViewBox; ...
[NoInterfaceObject] interface SVGZoomAndPan { const unsigned short SVG_ZOOMANDPAN_UNKNOWN = 0; const unsigned short SVG_ZOOMANDPAN_DISABLE = 1; const unsigned short SVG_ZOOMANDPAN_MAGNIFY = 2; attribute unsigned short zoomAndPan; };
Incorporate SVGURIReference into interfaces where it's needed
interface SVGImageElement { ... readonly attribute SVGAnimatedString href; };
interface SVGMPathElement { readonly attribute SVGAnimatedString href; };
Incorporate ElementTimeControl into SVGAnimationElement
No need for a separate interface, it's not used anywhere else.