/*
 * 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(foolip): useCurrentView and currentView have been removed:
    // https://github.com/w3c/svgwg/commit/4c26fd36937a65192024208d85c144a21071b057
    [DeprecateAs=V8SVGSVGElement_UseCurrentView_AttributeGetter] readonly attribute boolean useCurrentView;
    [DeprecateAs=V8SVGSVGElement_CurrentView_AttributeGetter] readonly attribute SVGViewSpec currentView;
             attribute float currentScale;
    // TODO(foolip): 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();

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

    // 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);

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