/*
 * Copyright (C) 2017 Igalia, S.L.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser 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
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include "config.h"
#include "AccessibilityController.h"

#if HAVE(ACCESSIBILITY)

#include <WebCore/NotImplemented.h>

namespace WTR {

void AccessibilityController::resetToConsistentState()
{
    notImplemented();
}

RefPtr<AccessibilityUIElement> AccessibilityController::accessibleElementById(JSStringRef id)
{
    notImplemented();
    return nullptr;
}

JSRetainPtr<JSStringRef> AccessibilityController::platformName()
{
    notImplemented();
    return nullptr;
}

Ref<AccessibilityUIElement> AccessibilityController::rootElement()
{
    notImplemented();
    return AccessibilityUIElement::create(nullptr);
}

Ref<AccessibilityUIElement> AccessibilityController::focusedElement()
{
    notImplemented();
    return AccessibilityUIElement::create(nullptr);
}

bool AccessibilityController::addNotificationListener(JSValueRef)
{
    notImplemented();
    return false;
}

bool AccessibilityController::removeNotificationListener()
{
    notImplemented();
    return false;
}

} // namespace WTR

#endif // HAVE(ACCESSIBILITY)
