18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 1999 Antti Koivisto (koivisto@kde.org) 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLCollection.h" 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLDocument.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLElement.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLObjectElement.h" 30231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "HTMLOptionElement.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NodeList.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <utility> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames; 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 395f1ab04193ad0130ca8204aadaceae083aca9881Feng QianHTMLCollection::HTMLCollection(PassRefPtr<Node> base, CollectionType type) 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_idsDone(false) 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_base(base) 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_type(type) 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_info(m_base->isDocumentNode() ? static_cast<Document*>(m_base.get())->collectionInfo(type) : 0) 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_ownsInfo(false) 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 485f1ab04193ad0130ca8204aadaceae083aca9881Feng QianHTMLCollection::HTMLCollection(PassRefPtr<Node> base, CollectionType type, CollectionCache* info) 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_idsDone(false) 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_base(base) 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_type(type) 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_info(info) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_ownsInfo(false) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 575f1ab04193ad0130ca8204aadaceae083aca9881Feng QianPassRefPtr<HTMLCollection> HTMLCollection::create(PassRefPtr<Node> base, CollectionType type) 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return adoptRef(new HTMLCollection(base, type)); 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHTMLCollection::~HTMLCollection() 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_ownsInfo) 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_info; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLCollection::resetCollectionInfo() const 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 702bde8e466a4451c7319e3a072d118917957d6554Steve Block uint64_t docversion = static_cast<HTMLDocument*>(m_base->document())->domTreeVersion(); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_info) { 735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_info = new CollectionCache; 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_ownsInfo = true; 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->version = docversion; 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_info->version != docversion) { 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->reset(); 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->version = docversion; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic Node* nextNodeOrSibling(Node* base, Node* node, bool includeChildren) 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return includeChildren ? node->traverseNextNode(base) : node->traverseNextSibling(base); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectElement* HTMLCollection::itemAfter(Element* previous) const 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool deep = true; 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (m_type) { 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocAll: 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocAnchors: 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocApplets: 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocEmbeds: 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocForms: 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocImages: 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocLinks: 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocObjects: 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocScripts: 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocumentNamedItems: 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case MapAreas: 1065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian case OtherCollection: 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case SelectOptions: 108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block case DataListOptions: 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case WindowNamedItems: 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NodeChildren: 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TRCells: 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TSectionRows: 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TableTBodies: 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project deep = false; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* current; 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!previous) 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project current = m_base->firstChild(); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project current = nextNodeOrSibling(m_base.get(), previous, deep); 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (; current; current = nextNodeOrSibling(m_base.get(), current, deep)) { 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!current->isElementNode()) 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element* e = static_cast<Element*>(current); 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (m_type) { 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocImages: 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(imgTag)) 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocScripts: 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(scriptTag)) 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocForms: 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(formTag)) 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TableTBodies: 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(tbodyTag)) 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TRCells: 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(tdTag) || e->hasLocalName(thTag)) 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TSectionRows: 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(trTag)) 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case SelectOptions: 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(optionTag)) 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 158231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block case DataListOptions: 159231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (e->hasLocalName(optionTag)) { 160231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block HTMLOptionElement* option = static_cast<HTMLOptionElement*>(e); 161231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!option->disabled() && !option->value().isEmpty()) 162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return e; 163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block break; 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case MapAreas: 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(areaTag)) 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocApplets: // all <applet> elements and <object> elements that contain Java Applets 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(appletTag)) 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(objectTag) && static_cast<HTMLObjectElement*>(e)->containsJavaApplet()) 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocEmbeds: 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(embedTag)) 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocObjects: 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (e->hasLocalName(objectTag)) 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocLinks: // all <a> and <area> elements with a value for href 184f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if ((e->hasLocalName(aTag) || e->hasLocalName(areaTag)) && e->fastHasAttribute(hrefAttr)) 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocAnchors: // all <a> elements with a value for name 188f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (e->hasLocalName(aTag) && e->fastHasAttribute(nameAttr)) 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocAll: 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NodeChildren: 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DocumentNamedItems: 1955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian case OtherCollection: 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case WindowNamedItems: 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned HTMLCollection::calcLength() const 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned len = 0; 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Element* current = itemAfter(0); current; current = itemAfter(current)) 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ++len; 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return len; 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// since the collections are to be "live", we have to do the 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// calculation every time if anything has changed 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned HTMLCollection::length() const 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resetCollectionInfo(); 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_info->hasLength) { 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->length = calcLength(); 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->hasLength = true; 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_info->length; 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode* HTMLCollection::item(unsigned index) const 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resetCollectionInfo(); 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_info->current && m_info->position == index) 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_info->current; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_info->hasLength && m_info->length <= index) 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_info->current || m_info->position > index) { 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->current = itemAfter(0); 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->position = 0; 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_info->current) 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element* e = m_info->current; 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned pos = m_info->position; e && pos < index; pos++) 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project e = itemAfter(e); 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->current = e; 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->position = index; 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_info->current; 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode* HTMLCollection::firstItem() const 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return item(0); 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode* HTMLCollection::nextItem() const 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resetCollectionInfo(); 254bc7b84de3fd863c500a8169fd00dca3811cadbb3Steve Block 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Look for the 'second' item. The first one is currentItem, already given back. 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element* retval = itemAfter(m_info->current); 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->current = retval; 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->position++; 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return retval; 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool HTMLCollection::checkForNameMatch(Element* element, bool checkName, const AtomicString& name) const 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!element->isHTMLElement()) 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block HTMLElement* e = toHTMLElement(element); 268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!checkName) 269545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return e->getIdAttribute() == name; 270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // document.all returns only images, forms, applets, objects and embeds 272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // by name (though everything by id) 273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_type == DocAll && 274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project !(e->hasLocalName(imgTag) || e->hasLocalName(formTag) || 275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project e->hasLocalName(appletTag) || e->hasLocalName(objectTag) || 276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project e->hasLocalName(embedTag) || e->hasLocalName(inputTag) || 277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project e->hasLocalName(selectTag))) 278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 280545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return e->getAttribute(nameAttr) == name && e->getIdAttribute() != name; 281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNode* HTMLCollection::namedItem(const AtomicString& name) const 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/nameditem.asp 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This method first searches for an object with a matching id 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // attribute. If a match is not found, the method then searches for an 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // object with a matching name attribute, but only on those elements 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // that are allowed a name attribute. 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resetCollectionInfo(); 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_idsDone = false; 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Element* e = itemAfter(0); e; e = itemAfter(e)) { 294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (checkForNameMatch(e, m_idsDone, name)) { 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->current = e; 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_idsDone = true; 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Element* e = itemAfter(0); e; e = itemAfter(e)) { 303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (checkForNameMatch(e, m_idsDone, name)) { 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->current = e; 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->current = 0; 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLCollection::updateNameCache() const 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_info->hasNameCache) 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Element* element = itemAfter(0); element; element = itemAfter(element)) { 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!element->isHTMLElement()) 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 3212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block HTMLElement* e = toHTMLElement(element); 322545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch const AtomicString& idAttrVal = e->getIdAttribute(); 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& nameAttrVal = e->getAttribute(nameAttr); 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!idAttrVal.isEmpty()) { 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // add to id cache 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<Element*>* idVector = m_info->idCache.get(idAttrVal.impl()); 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!idVector) { 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project idVector = new Vector<Element*>; 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->idCache.add(idAttrVal.impl(), idVector); 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project idVector->append(e); 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && (m_type != DocAll || 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (e->hasLocalName(imgTag) || e->hasLocalName(formTag) || 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project e->hasLocalName(appletTag) || e->hasLocalName(objectTag) || 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project e->hasLocalName(embedTag) || e->hasLocalName(inputTag) || 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project e->hasLocalName(selectTag)))) { 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // add to name cache 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<Element*>* nameVector = m_info->nameCache.get(nameAttrVal.impl()); 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!nameVector) { 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nameVector = new Vector<Element*>; 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->nameCache.add(nameAttrVal.impl(), nameVector); 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nameVector->append(e); 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->hasNameCache = true; 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLCollection::namedItems(const AtomicString& name, Vector<RefPtr<Node> >& result) const 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(result.isEmpty()); 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (name.isEmpty()) 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resetCollectionInfo(); 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateNameCache(); 361d0825bca7fe65beaee391d30da42e937db621564Steve Block m_info->checkConsistency(); 362d0825bca7fe65beaee391d30da42e937db621564Steve Block 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<Element*>* idResults = m_info->idCache.get(name.impl()); 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<Element*>* nameResults = m_info->nameCache.get(name.impl()); 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; idResults && i < idResults->size(); ++i) 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result.append(idResults->at(i)); 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; nameResults && i < nameResults->size(); ++i) 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result.append(nameResults->at(i)); 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNode* HTMLCollection::nextNamedItem(const AtomicString& name) const 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resetCollectionInfo(); 377d0825bca7fe65beaee391d30da42e937db621564Steve Block m_info->checkConsistency(); 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Element* e = itemAfter(m_info->current); e; e = itemAfter(e)) { 380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (checkForNameMatch(e, m_idsDone, name)) { 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->current = e; 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_idsDone) { 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->current = 0; 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_idsDone = true; 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Element* e = itemAfter(m_info->current); e; e = itemAfter(e)) { 393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (checkForNameMatch(e, m_idsDone, name)) { 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_info->current = e; 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e; 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<NodeList> HTMLCollection::tags(const String& name) 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_base->getElementsByTagName(name); 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 408