/*
 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
 *
 *  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://dev.w3.org/csswg/cssom-view/#mediaquerylist
[
    ActiveDOMObject,
    NoInterfaceObject,
    WillBeGarbageCollected
] interface MediaQueryList : EventTarget {
    readonly attribute DOMString media;
    readonly attribute boolean matches;

    // Even though this interface is now an event target, these functions
    // exist as aliases for addEventListener for backwards compatibility
    // with older versions of this interface. See the note at
    // http://dev.w3.org/csswg/cssom-view/#dom-mediaquerylist-removelistener
    [ImplementedAs=addDeprecatedListener] void addListener([Default=Undefined] optional EventListener listener);
    [ImplementedAs=removeDeprecatedListener]void removeListener([Default=Undefined] optional EventListener listener);

    attribute EventHandler onchange;
};
