xbl_binding_manager.cpp [plain text]
#ifndef KHTML_NO_XBL
#include "qptrdict.h"
#include "xml/dom_docimpl.h"
#include "xml/dom_elementimpl.h"
#include "rendering/render_style.h"
#include "xbl_binding_manager.h"
#include "xbl_binding.h"
using DOM::DocumentImpl;
using DOM::NodeImpl;
using DOM::ElementImpl;
using khtml::BindingURI;
namespace XBL {
XBLBindingManager::XBLBindingManager(DocumentImpl* doc)
:m_document(doc), m_bindingChainTable(0)
{
}
XBLBindingManager::~XBLBindingManager()
{
if (m_bindingChainTable) {
m_bindingChainTable->setAutoDelete(true);
delete m_bindingChainTable;
}
}
XBLBindingChain* XBLBindingManager::getBindingChain(NodeImpl* node)
{
if (!m_bindingChainTable)
return 0;
return m_bindingChainTable->find(node);
}
void XBLBindingManager::setBindingChain(NodeImpl* node, XBLBindingChain* bindingChain)
{
if (!m_bindingChainTable)
m_bindingChainTable = new QPtrDict<XBLBindingChain>;
if (bindingChain)
m_bindingChainTable->replace(node, bindingChain);
else
m_bindingChainTable->remove(node);
}
bool XBLBindingManager::loadBindings(NodeImpl* node, BindingURI* bindingURIs,
bool isStyleBinding, bool* resolveStyle)
{
if (resolveStyle) *resolveStyle = false;
if (!node->isElementNode()) return true;
bool dirty = false;
XBLBindingChain* bindingChain = getBindingChain(node);
if (bindingChain && isStyleBinding) {
XBLBindingChain* styleBindingChain = bindingChain->firstStyleBindingChain();
if (styleBindingChain) {
if (styleBindingChain->markedForDeath())
return false;
BindingURI* currURI = bindingURIs;
XBLBindingChain* currBindingChain = styleBindingChain;
for ( ; currURI && currBindingChain;
currURI = currURI->next(), currBindingChain = currBindingChain->nextChain()) {
if (currBindingChain->uri() != currURI->uri()) {
styleBindingChain->markForDeath();
return false;
}
}
if ((currURI && !currBindingChain) || (currBindingChain && !currURI)) {
styleBindingChain->markForDeath();
return false;
}
return bindingChain->loaded();
}
}
bindingChain = getBindingChain(node);
ElementImpl* elt = static_cast<ElementImpl*>(node);
for (BindingURI* currURI = bindingURIs; currURI; currURI = currURI->next()) {
XBLBindingChain* newBindingChain = new XBLBindingChain(elt, currURI->uri(), isStyleBinding);
if (newBindingChain) {
if (bindingChain && isStyleBinding)
bindingChain->lastBindingChain()->insertBindingChain(newBindingChain);
else {
newBindingChain->insertBindingChain(bindingChain);
setBindingChain(node, newBindingChain);
}
dirty = true;
}
bindingChain = newBindingChain;
}
if (!bindingChain) return true;
bindingChain = getBindingChain(node);
bool loaded = bindingChain->loaded();
if (loaded && resolveStyle)
*resolveStyle = bindingChain->hasStylesheets();
return loaded;
}
void XBLBindingManager::checkLoadState(ElementImpl* elt)
{
XBLBindingChain* chain = getBindingChain(elt);
if (chain && chain->loaded())
elt->setChanged();
}
}
#endif // KHTML_NO_XBL