/*
 * 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.
 */

// http://www.w3.org/TR/SVG2/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;
    // TODO(philipj): viewport should be a DOMRectReadOnly.
    [Measure] readonly attribute SVGRect viewport;
    // TODO(philipj): useCurrentView and currentView have been removed:
    // https://github.com/w3c/svgwg/commit/4c26fd36937a65192024208d85c144a21071b057
    [Measure] readonly attribute boolean useCurrentView;
    [Measure] readonly attribute SVGViewSpec currentView;
             attribute float currentScale;
    // TODO(philipj): currentTranslate should be a DOMPointReadOnly.
    [ImplementedAs=currentTranslateFromJavascript] readonly attribute SVGPoint currentTranslate;

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

    [RuntimeEnabled=smil] void pauseAnimations();
    [RuntimeEnabled=smil] void unpauseAnimations();
    [RuntimeEnabled=smil] boolean animationsPaused();
    [RuntimeEnabled=smil] float getCurrentTime();
    [RuntimeEnabled=smil] void setCurrentTime(float seconds);

    // TODO(philipj): 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(philipj): 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);

    // TODO(philipj): The following was part of SVG 1.1:
    // http://www.w3.org/TR/SVG11/struct.html#InterfaceSVGSVGElement
    [Measure] Element getElementById(DOMString elementId);
};

SVGSVGElement implements SVGFitToViewBox;
SVGSVGElement implements SVGZoomAndPan;
