blob: f9eae7096d7db3fe57f99ea65504fcdd73811a48 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/style/StyleVariableData.h"
#include "core/style/DataEquivalency.h"
namespace blink {
bool StyleVariableData::operator==(const StyleVariableData& other) const
{
// It's technically possible for divergent roots to be value-equal,
// but unlikely. This equality operator is used for optimization purposes
// so it's OK to be occasionally wrong.
// TODO(shanestephens): Rename this to something that indicates it may not
// always return equality.
if (m_root != other.m_root)
return false;
if (m_data.size() != other.m_data.size())
return false;
for (const auto& iter : m_data) {
RefPtr<CSSVariableData> otherData = other.m_data.get(iter.key);
if (!dataEquivalent(iter.value, otherData))
return false;
}
return true;
}
StyleVariableData::StyleVariableData(StyleVariableData& other)
{
if (!other.m_root) {
m_root = &other;
} else {
m_data = other.m_data;
m_root = other.m_root;
}
}
CSSVariableData* StyleVariableData::getVariable(const AtomicString& name) const
{
auto result = m_data.find(name);
if (result == m_data.end() && m_root)
return m_root->getVariable(name);
if (result == m_data.end())
return nullptr;
return result->value.get();
}
std::unique_ptr<HashMap<AtomicString, RefPtr<CSSVariableData>>> StyleVariableData::getVariables() const
{
std::unique_ptr<HashMap<AtomicString, RefPtr<CSSVariableData>>> result;
if (m_root) {
result.reset(new HashMap<AtomicString, RefPtr<CSSVariableData>>(m_root->m_data));
for (auto it = m_data.begin(); it != m_data.end(); ++it)
result->set(it->key, it->value);
} else {
result.reset(new HashMap<AtomicString, RefPtr<CSSVariableData>>(m_data));
}
return result;
}
} // namespace blink