1/*
2 * Copyright (C) 2011, Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
23 * DAMAGE.
24 */
25
26#include "config.h"
27#include "DOMWindowIndexedDatabase.h"
28
29#if ENABLE(INDEXED_DATABASE)
30
31#include "DOMWindow.h"
32#include "Document.h"
33#include "IDBFactory.h"
34#include "Page.h"
35#include "PageGroupIndexedDatabase.h"
36#include "SecurityOrigin.h"
37
38namespace WebCore {
39
40DOMWindowIndexedDatabase::DOMWindowIndexedDatabase(DOMWindow* window)
41    : DOMWindowProperty(window->frame())
42    , m_window(window)
43{
44}
45
46DOMWindowIndexedDatabase::~DOMWindowIndexedDatabase()
47{
48}
49
50const char* DOMWindowIndexedDatabase::supplementName()
51{
52    return "DOMWindowIndexedDatabase";
53}
54
55DOMWindowIndexedDatabase* DOMWindowIndexedDatabase::from(DOMWindow* window)
56{
57    DOMWindowIndexedDatabase* supplement = static_cast<DOMWindowIndexedDatabase*>(Supplement<DOMWindow>::from(window, supplementName()));
58    if (!supplement) {
59        auto newSupplement = std::make_unique<DOMWindowIndexedDatabase>(window);
60        supplement = newSupplement.get();
61        provideTo(window, supplementName(), WTF::move(newSupplement));
62    }
63    return supplement;
64}
65
66void DOMWindowIndexedDatabase::disconnectFrameForPageCache()
67{
68    m_suspendedIDBFactory = m_idbFactory.release();
69    DOMWindowProperty::disconnectFrameForPageCache();
70}
71
72void DOMWindowIndexedDatabase::reconnectFrameFromPageCache(Frame* frame)
73{
74    DOMWindowProperty::reconnectFrameFromPageCache(frame);
75    m_idbFactory = m_suspendedIDBFactory.release();
76}
77
78void DOMWindowIndexedDatabase::willDestroyGlobalObjectInCachedFrame()
79{
80    m_suspendedIDBFactory = nullptr;
81    DOMWindowProperty::willDestroyGlobalObjectInCachedFrame();
82}
83
84void DOMWindowIndexedDatabase::willDestroyGlobalObjectInFrame()
85{
86    m_idbFactory = nullptr;
87    DOMWindowProperty::willDestroyGlobalObjectInFrame();
88}
89
90void DOMWindowIndexedDatabase::willDetachGlobalObjectFromFrame()
91{
92    m_idbFactory = nullptr;
93    DOMWindowProperty::willDetachGlobalObjectFromFrame();
94}
95
96IDBFactory* DOMWindowIndexedDatabase::indexedDB(DOMWindow* window)
97{
98    return from(window)->indexedDB();
99}
100
101IDBFactory* DOMWindowIndexedDatabase::indexedDB()
102{
103    Document* document = m_window->document();
104    if (!document)
105        return 0;
106
107    Page* page = document->page();
108    if (!page)
109        return 0;
110
111    if (!m_window->isCurrentlyDisplayedInFrame())
112        return 0;
113
114    if (!m_idbFactory)
115        m_idbFactory = IDBFactory::create(PageGroupIndexedDatabase::from(page->group())->factoryBackend());
116    return m_idbFactory.get();
117}
118
119} // namespace WebCore
120
121#endif // ENABLE(INDEXED_DATABASE)
122