diff options
Diffstat (limited to 'WebCore/html/HTMLNameCollection.cpp')
-rw-r--r-- | WebCore/html/HTMLNameCollection.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/WebCore/html/HTMLNameCollection.cpp b/WebCore/html/HTMLNameCollection.cpp new file mode 100644 index 0000000..fdebe78 --- /dev/null +++ b/WebCore/html/HTMLNameCollection.cpp @@ -0,0 +1,96 @@ +/* + * Copyright (C) 1999 Lars Knoll (knoll@kde.org) + * (C) 1999 Antti Koivisto (koivisto@kde.org) + * Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include "config.h" +#include "HTMLNameCollection.h" + +#include "Element.h" +#include "HTMLDocument.h" +#include "HTMLNames.h" +#include "HTMLObjectElement.h" + +namespace WebCore { + +using namespace HTMLNames; + +HTMLNameCollection::HTMLNameCollection(PassRefPtr<Document> document, Type type, const String& name) + : HTMLCollection(document.get(), type, document->nameCollectionInfo(type, name)) + , m_name(name) +{ +} + +Element* HTMLNameCollection::itemAfter(Element* previous) const +{ + ASSERT(previous != base()); + + Node* current; + if (!previous) + current = base()->firstChild(); + else + current = previous->traverseNextNode(base()); + + for (; current; current = current->traverseNextNode(base())) { + if (!current->isElementNode()) + continue; + Element* e = static_cast<Element*>(current); + switch (type()) { + case WindowNamedItems: + // find only images, forms, applets, embeds and objects by name, + // but anything by id + if (e->hasTagName(imgTag) || + e->hasTagName(formTag) || + e->hasTagName(appletTag) || + e->hasTagName(embedTag) || + e->hasTagName(objectTag)) + if (e->getAttribute(nameAttr) == m_name) + return e; + if (e->getAttribute(idAttr) == m_name) + return e; + break; + case DocumentNamedItems: + // find images, forms, applets, embeds, objects and iframes by name, + // applets and object by id, and images by id but only if they have + // a name attribute (this very strange rule matches IE) + if (e->hasTagName(formTag) || e->hasTagName(embedTag) || e->hasTagName(iframeTag)) { + if (e->getAttribute(nameAttr) == m_name) + return e; + } else if (e->hasTagName(appletTag)) { + if (e->getAttribute(nameAttr) == m_name || e->getAttribute(idAttr) == m_name) + return e; + } else if (e->hasTagName(objectTag)) { + if ((e->getAttribute(nameAttr) == m_name || e->getAttribute(idAttr) == m_name) + && static_cast<HTMLObjectElement*>(e)->isDocNamedItem()) + return e; + } else if (e->hasTagName(imgTag)) { + if (e->getAttribute(nameAttr) == m_name || (e->getAttribute(idAttr) == m_name && e->hasAttribute(nameAttr))) + return e; + } + break; + default: + ASSERT_NOT_REACHED(); + } + } + + return 0; +} + +} |