/*
 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
 * Copyright (C) 2004, 2005, 2010 Rob Buis <buis@kde.org>
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 * Copyright (C) 2006 Apple Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

// https://svgwg.org/svg2-draft/struct.html#InterfaceSVGSVGElement

interface SVGSVGElement : SVGGraphicsElement {
    [MeasureAs=SVG1DOMSVGElement] readonly attribute SVGAnimatedLength x;
    [MeasureAs=SVG1DOMSVGElement] readonly attribute SVGAnimatedLength y;
    [MeasureAs=SVG1DOMSVGElement] readonly attribute SVGAnimatedLength width;
    [MeasureAs=SVG1DOMSVGElement] readonly attribute SVGAnimatedLength height;

    attribute float currentScale;
    // TODO(foolip): currentTranslate should be a DOMPointReadOnly.
    [ImplementedAs=currentTranslateFromJavascript] readonly attribute SVGPoint currentTranslate;

    // TODO(foolip): The rect arguments should be DOMRectReadOnly.
    NodeList getIntersectionList(SVGRect rect, SVGElement? referenceElement);
    NodeList getEnclosureList(SVGRect rect, SVGElement? referenceElement);
    boolean checkIntersection(SVGElement element, SVGRect rect);
    boolean checkEnclosure(SVGElement element, SVGRect rect);

    void deselectAll();

    [Measure] SVGNumber createSVGNumber();
    [Measure] SVGLength createSVGLength();
    [Measure] SVGAngle createSVGAngle();
    // TODO(foolip): SVGPoint/Matrix/Rect should be DOMPoint/Matrix/Rect.
    [Measure] SVGPoint createSVGPoint();
    [Measure] SVGMatrix createSVGMatrix();
    [Measure] SVGRect createSVGRect();
    [Measure] SVGTransform createSVGTransform();
    [Measure] SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);

    [Measure] Element getElementById(DOMString elementId);

    [MeasureAs=SVGSVGElementSuspendRedraw] unsigned long suspendRedraw(unsigned long maxWaitMilliseconds);
    [MeasureAs=SVGSVGElementUnsuspendRedraw] void unsuspendRedraw(unsigned long suspendHandleId);
    [MeasureAs=SVGSVGElementUnsuspendRedrawAll] void unsuspendRedrawAll();
    [MeasureAs=SVGSVGElementForceRedraw] void forceRedraw();

    // SVG Animations
    // https://svgwg.org/specs/animations/#InterfaceSVGSVGElement
    [MeasureAs=SVGSMILPausing] void pauseAnimations();
    [MeasureAs=SVGSMILPausing] void unpauseAnimations();
    [MeasureAs=SVGSMILPausing] boolean animationsPaused();
    [MeasureAs=SVGSMILCurrentTime] float getCurrentTime();
    [MeasureAs=SVGSMILCurrentTime] void setCurrentTime(float seconds);
};

SVGSVGElement implements SVGFitToViewBox;
SVGSVGElement implements SVGZoomAndPan;
