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.