15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999-2003 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2010 Apple Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSValueList.h" 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSParserValues.h" 25591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringBuilder.h" 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CSSValueList::CSSValueList(ClassType classType, ValueListSeparator listSeparator) 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : CSSValue(classType) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_valueListSeparator = listSeparator; 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CSSValueList::CSSValueList(ValueListSeparator listSeparator) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : CSSValue(ValueListClass) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_valueListSeparator = listSeparator; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CSSValueList::CSSValueList(CSSParserValueList* parserValues) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : CSSValue(ValueListClass) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_valueListSeparator = SpaceSeparator; 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parserValues) { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_values.reserveInitialCapacity(parserValues->size()); 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < parserValues->size(); ++i) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_values.uncheckedAppend(parserValues->valueAt(i)->createCSSValue()); 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool CSSValueList::removeAll(CSSValue* val) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool found = false; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t index = 0; index < m_values.size(); index++) { 56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<CSSValue>& value = m_values.at(index); 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (value && val && value->equals(*val)) { 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_values.remove(index); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) found = true; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return found; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool CSSValueList::hasValue(CSSValue* val) const 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t index = 0; index < m_values.size(); index++) { 69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const RefPtr<CSSValue>& value = m_values.at(index); 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (value && val && value->equals(*val)) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<CSSValueList> CSSValueList::copy() 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<CSSValueList> newList; 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (m_valueListSeparator) { 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SpaceSeparator: 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) newList = createSpaceSeparated(); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CommaSeparator: 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) newList = createCommaSeparated(); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SlashSeparator: 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) newList = createSlashSeparated(); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t index = 0; index < m_values.size(); index++) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) newList->append(m_values[index]); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return newList.release(); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochString CSSValueList::customCssText(CssTextFormattingFlags formattingFlag) const 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringBuilder result; 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String separator; 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (m_valueListSeparator) { 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SpaceSeparator: 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) separator = " "; 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CommaSeparator: 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) separator = ", "; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SlashSeparator: 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) separator = " / "; 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned size = m_values.size(); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < size; i++) { 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!result.isEmpty()) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.append(separator); 119591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (formattingFlag == AlwaysQuoteCSSString && m_values[i]->isPrimitiveValue()) 120591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch result.append(toCSSPrimitiveValue(m_values[i].get())->customCssText(AlwaysQuoteCSSString)); 121591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch else 122591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch result.append(m_values[i]->cssText()); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result.toString(); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool CSSValueList::equals(const CSSValueList& other) const 129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_valueListSeparator == other.m_valueListSeparator && compareCSSValueVector<CSSValue>(m_values, other.m_values); 131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool CSSValueList::equals(const CSSValue& other) const 134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_values.size() != 1) 136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const RefPtr<CSSValue>& value = m_values[0]; 139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return value && value->equals(other); 140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String CSSValueList::customSerializeResolvingVariables(const HashMap<AtomicString, String>& variables) const 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringBuilder result; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String separator; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (m_valueListSeparator) { 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SpaceSeparator: 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) separator = " "; 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CommaSeparator: 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) separator = ", "; 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SlashSeparator: 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) separator = " / "; 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned size = m_values.size(); 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < size; i++) { 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!result.isEmpty()) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.append(separator); 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.append(m_values[i]->serializeResolvingVariables(variables)); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result.toString(); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CSSValueList::addSubresourceStyleURLs(ListHashSet<KURL>& urls, const StyleSheetContents* styleSheet) const 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t size = m_values.size(); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < size; ++i) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_values[i]->addSubresourceStyleURLs(urls, styleSheet); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool CSSValueList::hasFailedOrCanceledSubresources() const 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < m_values.size(); ++i) { 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_values[i]->hasFailedOrCanceledSubresources()) 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CSSValueList::CSSValueList(const CSSValueList& cloneFrom) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : CSSValue(cloneFrom.classType(), /* isCSSOMSafe */ true) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_valueListSeparator = cloneFrom.m_valueListSeparator; 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_values.resize(cloneFrom.m_values.size()); 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < m_values.size(); ++i) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_values[i] = cloneFrom.m_values[i]->cloneForCSSOM(); 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<CSSValueList> CSSValueList::cloneForCSSOM() const 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptRef(new CSSValueList(*this)); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 201