/*
 * Copyright (C) 2006, 2010 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://html.spec.whatwg.org/C/#the-script-element
[HTMLConstructor]
interface HTMLScriptElement : HTMLElement {
    [CEReactions, Reflect, URL, RaisesException=Setter] attribute ScriptURLString src;
    [CEReactions, Reflect] attribute DOMString type;
    [CEReactions, Reflect] attribute boolean noModule;
    [CEReactions, Reflect] attribute DOMString charset;
    [CEReactions] attribute boolean async;
    [CEReactions, Reflect] attribute boolean defer;
    [CEReactions, Reflect, ReflectOnly=("anonymous","use-credentials"), ReflectEmpty="anonymous", ReflectInvalid="anonymous"] attribute DOMString? crossOrigin;
    [CEReactions, RaisesException=Setter] attribute ScriptString text;
    [CEReactions, Reflect, ReflectOnly=("", "no-referrer", "no-referrer-when-downgrade", "same-origin", "origin", "strict-origin", "origin-when-cross-origin", "strict-origin-when-cross-origin", "unsafe-url"), ReflectEmpty="", ReflectInvalid=""] attribute DOMString? referrerPolicy;
    [CEReactions, MeasureAs=PriorityHints, RuntimeEnabled=PriorityHints, Reflect, ReflectOnly=("low", "auto", "high"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString importance;

    // obsolete members
    // https://html.spec.whatwg.org/C/#HTMLScriptElement-partial
    // TODO(foolip): The event and htmlFor attributes should return the empty
    // string on getting, and do nothing on setting.
    [CEReactions, Reflect] attribute DOMString event;
    [CEReactions, Reflect=for] attribute DOMString htmlFor;

    // Subresource Integrity
    // https://w3c.github.io/webappsec-subresource-integrity/#HTMLScriptElement
    [Reflect] attribute DOMString integrity;
};
