10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/* 20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Apple Inc. All rights reserved. 30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without 50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions 60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * are met: 70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 1. Redistributions of source code must retain the above copyright 90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer. 100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer in the 120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * documentation and/or other materials provided with the distribution. 130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * its contributors may be used to endorse or promote products derived 150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * from this software without specific prior written permission. 160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */ 280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "config.h" 300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "AccessibilitySlider.h" 310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "AXObjectCache.h" 330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "HTMLInputElement.h" 340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "HTMLNames.h" 350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "RenderObject.h" 360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "RenderSlider.h" 370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore { 390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochusing namespace HTMLNames; 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochAccessibilitySlider::AccessibilitySlider(RenderObject* renderer) 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch : AccessibilityRenderObject(renderer) 440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<AccessibilitySlider> AccessibilitySlider::create(RenderObject* renderer) 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return adoptRef(new AccessibilitySlider(renderer)); 500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochconst AccessibilityObject::AccessibilityChildrenVector& AccessibilitySlider::children() 530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!m_haveChildren) 550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch addChildren(); 560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return m_children; 570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochAccessibilityOrientation AccessibilitySlider::orientation() const 600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Default to horizontal in the unknown case. 620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!m_renderer) 630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return AccessibilityOrientationHorizontal; 640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RenderStyle* style = m_renderer->style(); 660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!style) 670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return AccessibilityOrientationHorizontal; 680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ControlPart styleAppearance = style->appearance(); 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch switch (styleAppearance) { 71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case SliderThumbHorizontalPart: 72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case SliderHorizontalPart: 73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case MediaSliderPart: 74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return AccessibilityOrientationHorizontal; 75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case SliderThumbVerticalPart: 77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case SliderVerticalPart: 78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case MediaVolumeSliderPart: 79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return AccessibilityOrientationVertical; 800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block default: 82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return AccessibilityOrientationHorizontal; 830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid AccessibilitySlider::addChildren() 870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_haveChildren); 890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_haveChildren = true; 910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch AXObjectCache* cache = m_renderer->document()->axObjectCache(); 932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch AccessibilitySliderThumb* thumb = static_cast<AccessibilitySliderThumb*>(cache->getOrCreate(SliderThumbRole)); 950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch thumb->setParentObject(this); 962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Before actually adding the value indicator to the hierarchy, 982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // allow the platform to make a final decision about it. 992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (thumb->accessibilityIsIgnored()) 1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch cache->remove(thumb->axObjectID()); 1012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else 1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_children.append(thumb); 1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochconst AtomicString& AccessibilitySlider::getAttribute(const QualifiedName& attribute) const 1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return element()->getAttribute(attribute); 1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 110f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochAccessibilityObject* AccessibilitySlider::elementAccessibilityHitTest(const IntPoint& point) const 111f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 112f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_children.size()) { 113f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ASSERT(m_children.size() == 1); 114f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_children[0]->elementRect().contains(point)) 115f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return m_children[0].get(); 116f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return axObjectCache()->getOrCreate(m_renderer); 119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool AccessibilitySlider::accessibilityIsIgnored() const 122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block AccessibilityObjectInclusion decision = accessibilityIsIgnoredBase(); 124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (decision == IncludeObject) 125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (decision == IgnoreObject) 127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochfloat AccessibilitySlider::valueForRange() const 1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return element()->value().toFloat(); 1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochfloat AccessibilitySlider::maxValueForRange() const 1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 139f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return static_cast<float>(element()->maximum()); 1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochfloat AccessibilitySlider::minValueForRange() const 1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 144f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return static_cast<float>(element()->minimum()); 1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid AccessibilitySlider::setValue(const String& value) 1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch HTMLInputElement* input = element(); 1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (input->value() == value) 1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch input->setValue(value); 1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Fire change event manually, as RenderSlider::setValueForPosition does. 1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch input->dispatchFormControlChangeEvent(); 1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochHTMLInputElement* AccessibilitySlider::element() const 1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return static_cast<HTMLInputElement*>(m_renderer->node()); 1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochAccessibilitySliderThumb::AccessibilitySliderThumb() 1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch : m_parentSlider(0) 1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<AccessibilitySliderThumb> AccessibilitySliderThumb::create() 1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return adoptRef(new AccessibilitySliderThumb()); 1740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntRect AccessibilitySliderThumb::elementRect() const 1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!m_parentSlider->renderer()) 1790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return IntRect(); 1800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch IntRect intRect = toRenderSlider(m_parentSlider->renderer())->thumbRect(); 1820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch FloatQuad floatQuad = m_parentSlider->renderer()->localToAbsoluteQuad(FloatRect(intRect)); 1830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return floatQuad.enclosingBoundingBox(); 1850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntSize AccessibilitySliderThumb::size() const 1880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return elementRect().size(); 1900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool AccessibilitySliderThumb::accessibilityIsIgnored() const 1932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 1942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch AccessibilityObjectInclusion decision = accessibilityPlatformIncludesObject(); 1952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (decision == IncludeObject) 1962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return false; 1972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (decision == IgnoreObject) 1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return true; 1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return false; 2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore 204