DOMWindowIndexedDatabase.cpp [plain text]
#include "config.h"
#include "DOMWindowIndexedDatabase.h"
#if ENABLE(INDEXED_DATABASE)
#include "DOMWindow.h"
#include "Document.h"
#include "IDBFactory.h"
#include "Page.h"
#include "PageGroupIndexedDatabase.h"
#include "SecurityOrigin.h"
namespace WebCore {
DOMWindowIndexedDatabase::DOMWindowIndexedDatabase(DOMWindow* window)
: DOMWindowProperty(window->frame())
, m_window(window)
{
}
DOMWindowIndexedDatabase::~DOMWindowIndexedDatabase()
{
}
DOMWindowIndexedDatabase* DOMWindowIndexedDatabase::from(DOMWindow* window)
{
DEFINE_STATIC_LOCAL(AtomicString, name, ("DOMWindowIndexedDatabase"));
DOMWindowIndexedDatabase* supplement = static_cast<DOMWindowIndexedDatabase*>(Supplement<DOMWindow>::from(window, name));
if (!supplement) {
supplement = new DOMWindowIndexedDatabase(window);
provideTo(window, name, adoptPtr(supplement));
}
return supplement;
}
void DOMWindowIndexedDatabase::disconnectFrameForPageCache()
{
m_suspendedIDBFactory = m_idbFactory.release();
DOMWindowProperty::disconnectFrameForPageCache();
}
void DOMWindowIndexedDatabase::reconnectFrameFromPageCache(Frame* frame)
{
DOMWindowProperty::reconnectFrameFromPageCache(frame);
m_idbFactory = m_suspendedIDBFactory.release();
}
void DOMWindowIndexedDatabase::willDestroyGlobalObjectInCachedFrame()
{
m_suspendedIDBFactory = nullptr;
DOMWindowProperty::willDestroyGlobalObjectInCachedFrame();
}
void DOMWindowIndexedDatabase::willDestroyGlobalObjectInFrame()
{
m_idbFactory = nullptr;
DOMWindowProperty::willDestroyGlobalObjectInFrame();
}
void DOMWindowIndexedDatabase::willDetachGlobalObjectFromFrame()
{
m_idbFactory = nullptr;
DOMWindowProperty::willDetachGlobalObjectFromFrame();
}
IDBFactory* DOMWindowIndexedDatabase::webkitIndexedDB(DOMWindow* window)
{
return from(window)->webkitIndexedDB();
}
IDBFactory* DOMWindowIndexedDatabase::webkitIndexedDB()
{
Document* document = m_window->document();
if (!document)
return 0;
Page* page = document->page();
if (!page)
return 0;
if (!document->securityOrigin()->canAccessDatabase())
return 0;
if (!m_window->isCurrentlyDisplayedInFrame())
return 0;
if (!m_idbFactory)
m_idbFactory = IDBFactory::create(PageGroupIndexedDatabase::from(page->group())->factoryBackend());
return m_idbFactory.get();
}
}
#endif // ENABLE(INDEXED_DATABASE)