/*
 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "config.h"
#include "modules/notifications/DOMWindowNotifications.h"

#if ENABLE(LEGACY_NOTIFICATIONS)

#include "core/dom/Document.h"
#include "core/page/DOMWindow.h"
#include "core/page/Page.h"
#include "modules/notifications/NotificationCenter.h"
#include "modules/notifications/NotificationController.h"

namespace WebCore {

DOMWindowNotifications::DOMWindowNotifications(DOMWindow* window)
    : DOMWindowProperty(window->frame())
    , m_window(window)
{
}

DOMWindowNotifications::~DOMWindowNotifications()
{
}

const char* DOMWindowNotifications::supplementName()
{
    return "DOMWindowNotifications";
}

DOMWindowNotifications* DOMWindowNotifications::from(DOMWindow* window)
{
    DOMWindowNotifications* supplement = static_cast<DOMWindowNotifications*>(Supplement<DOMWindow>::from(window, supplementName()));
    if (!supplement) {
        supplement = new DOMWindowNotifications(window);
        Supplement<DOMWindow>::provideTo(window, supplementName(), adoptPtr(supplement));
    }
    return supplement;
}

NotificationCenter* DOMWindowNotifications::webkitNotifications(DOMWindow* window)
{
    return DOMWindowNotifications::from(window)->webkitNotifications();
}

void DOMWindowNotifications::willDestroyGlobalObjectInFrame()
{
    m_notificationCenter = nullptr;
    DOMWindowProperty::willDestroyGlobalObjectInFrame();
}

void DOMWindowNotifications::willDetachGlobalObjectFromFrame()
{
    m_notificationCenter = nullptr;
    DOMWindowProperty::willDetachGlobalObjectFromFrame();
}

NotificationCenter* DOMWindowNotifications::webkitNotifications()
{
    if (!m_window->isCurrentlyDisplayedInFrame())
        return 0;

    if (m_notificationCenter)
        return m_notificationCenter.get();

    Document* document = m_window->document();
    if (!document)
        return 0;

    Page* page = document->page();
    if (!page)
        return 0;

    NotificationClient* provider = NotificationController::clientFrom(page);
    if (provider)
        m_notificationCenter = NotificationCenter::create(document, provider);

    return m_notificationCenter.get();
}

} // namespace WebCore

#endif // ENABLE(LEGACY_NOTIFICATIONS)
