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

#pragma once

#include "ActiveDOMCallback.h"
#include "CallbackResult.h"
#include <wtf/RefCounted.h>

namespace WebCore {

class MediaQueryList;

class MediaQueryListListener : public RefCounted<MediaQueryListListener>, public ActiveDOMCallback {
public:
    enum Type {
        JSMediaQueryListListenerType
    };

    virtual CallbackResult<void> handleEvent(MediaQueryList&) = 0;
    virtual bool operator==(const MediaQueryListListener&) const = 0;

    Type type() const { return m_type; }

protected:
    explicit MediaQueryListListener(ScriptExecutionContext* context, Type type)
        : ActiveDOMCallback(context)
        , m_type(type)
    {
    }

private:
    Type m_type;
};

} // namespace WebCore
