/*
 * 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/page/DOMWindowProperty.h"
#include "core/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
