/*
 * Copyright (C) 2011, Google Inc. All rights reserved.
 *
 * 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 GOOGLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
 */

#ifndef DOMWindowIndexedDatabase_h
#define DOMWindowIndexedDatabase_h

#include "core/frame/DOMWindowProperty.h"
#include "platform/Supplementable.h"

namespace WebCore {

class IDBFactory;
class DOMWindow;

class DOMWindowIndexedDatabase : public DOMWindowProperty, public Supplement<DOMWindow> {
public:
    virtual ~DOMWindowIndexedDatabase();
    static DOMWindowIndexedDatabase* from(DOMWindow*);

    static IDBFactory* indexedDB(DOMWindow*);

    virtual void willDestroyGlobalObjectInFrame() OVERRIDE;
    virtual void willDetachGlobalObjectFromFrame() OVERRIDE;

private:
    explicit DOMWindowIndexedDatabase(DOMWindow*);

    IDBFactory* indexedDB();
    static const char* supplementName();

    DOMWindow* m_window;
    RefPtr<IDBFactory> m_idbFactory;
};

} // namespace WebCore

#endif // DOMWindowIndexedDatabase_h
