/*
 * 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/#the-script-element

interface HTMLScriptElement : HTMLElement {
    [CEReactions, Reflect, URL] attribute DOMString src;
    [CEReactions, Reflect] attribute DOMString type;
    [CEReactions, Reflect, RuntimeEnabled=ModuleScripts] 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] attribute DOMString text;

    // obsolete members
    // https://html.spec.whatwg.org/#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;

    // Content Security Policy
    // https://w3c.github.io/webappsec/specs/content-security-policy/#script-src-the-nonce-attribute
    [CEReactions, RuntimeEnabled=ExperimentalContentSecurityPolicyFeatures] attribute DOMString nonce;

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