#include "config.h"
#include "Page.h"
#include "Frame.h"
#include "FrameTree.h"
#include "StringHash.h"
#include "Widget.h"
#include <kjs/collector.h>
#include <kjs/JSLock.h>
#include <wtf/HashMap.h>
using namespace KJS;
namespace WebCore {
static HashSet<Page*>* allPages;
static HashMap<String, HashSet<Page*>*>* frameNamespaces;
void Page::init()
{
if (!allPages) {
allPages = new HashSet<Page*>;
setFocusRingColorChangeFunction(setNeedsReapplyStyles);
}
ASSERT(!allPages->contains(this));
allPages->add(this);
}
Page::~Page()
{
m_mainFrame->setView(0);
setGroupName(String());
allPages->remove(this);
for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
frame->pageDestroyed();
#ifndef NDEBUG
Frame::cancelAllKeepAlive();
#endif
}
void Page::setMainFrame(PassRefPtr<Frame> mainFrame)
{
ASSERT(!m_mainFrame);
m_mainFrame = mainFrame;
}
void Page::setGroupName(const String& name)
{
if (frameNamespaces && !m_groupName.isEmpty()) {
HashSet<Page*>* oldNamespace = frameNamespaces->get(m_groupName);
if (oldNamespace) {
oldNamespace->remove(this);
if (oldNamespace->isEmpty()) {
frameNamespaces->remove(m_groupName);
delete oldNamespace;
}
}
}
m_groupName = name;
if (!name.isEmpty()) {
if (!frameNamespaces)
frameNamespaces = new HashMap<String, HashSet<Page*>*>;
HashSet<Page*>* newNamespace = frameNamespaces->get(name);
if (!newNamespace) {
newNamespace = new HashSet<Page*>;
frameNamespaces->add(name, newNamespace);
}
newNamespace->add(this);
}
}
const HashSet<Page*>* Page::frameNamespace() const
{
return (frameNamespaces && !m_groupName.isEmpty()) ? frameNamespaces->get(m_groupName) : 0;
}
const HashSet<Page*>* Page::frameNamespace(const String& groupName)
{
return (frameNamespaces && !groupName.isEmpty()) ? frameNamespaces->get(groupName) : 0;
}
void Page::setNeedsReapplyStyles()
{
if (!allPages)
return;
HashSet<Page*>::iterator end = allPages->end();
for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it)
for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext())
frame->setNeedsReapplyStyles();
}
void Page::setNeedsReapplyStylesForSettingsChange(Settings* settings)
{
if (!allPages)
return;
HashSet<Page*>::iterator end = allPages->end();
for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it)
for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext())
if (frame->settings() == settings)
frame->setNeedsReapplyStyles();
}
SelectionController& Page::dragCaret() const
{
return m_dragCaret;
}
void Page::setDragCaret(const SelectionController& dragCaret)
{
if (m_dragCaret != dragCaret) {
m_dragCaret.needsCaretRepaint();
m_dragCaret = dragCaret;
m_dragCaret.needsCaretRepaint();
}
}
}