15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Portions are Copyright (C) 2002 Netscape Communications Corporation.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Other contributors: David Baron <dbaron@fas.harvard.edu>
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Lesser General Public
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2.1 of the License, or (at your option) any later version.
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Lesser General Public License for more details.
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Lesser General Public
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License along with this library; if not, write to the Free Software
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Alternatively, the document type parsing portions of this file may be used
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * under the terms of either the Mozilla Public License Version 1.1, found at
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (the "GPL"), in which case the provisions of the MPL or the GPL are
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * applicable instead of those above.  If you wish to allow use of your
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version of this file only under the terms of one of those two
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * licenses (the MPL or the GPL) and not to allow others to use your
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version of this file under the LGPL, indicate your decision by
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * deleting the provisions above and replace them with the notice and
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * other provisions required by the MPL or the GPL, as the case may be.
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * If you do not delete the provisions above, a recipient may use your
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version of this file under any of the LGPL, the MPL or the GPL.
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLDocument.h"
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptController.h"
575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
5876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/frame/LocalDOMWindow.h"
5951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/frame/FrameView.h"
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLBodyElement.h"
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h"
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h"
6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
6551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "wtf/text/StringBuilder.h"
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
71e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochHTMLDocument::HTMLDocument(const DocumentInit& initializer, DocumentClassFlags extendedDocumentClasses)
72e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    : Document(initializer, HTMLDocumentClass | extendedDocumentClasses)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearXMLVersion();
7510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (isSrcdocDocument() || initializer.importsController()) {
7610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        ASSERT(inNoQuirksMode());
7710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        lockCompatibilityMode();
7810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLDocument::~HTMLDocument()
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)HTMLBodyElement* HTMLDocument::htmlBodyElement() const
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    HTMLElement* body = this->body();
88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return isHTMLBodyElement(body) ? toHTMLBodyElement(body) : 0;
89591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)const AtomicString& HTMLDocument::bodyAttributeValue(const QualifiedName& name) const
92591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (HTMLBodyElement* body = htmlBodyElement())
941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return body->fastGetAttribute(name);
951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return nullAtom;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLDocument::setBodyAttribute(const QualifiedName& name, const AtomicString& value)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (HTMLBodyElement* body = htmlBodyElement()) {
1011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        // FIXME: This check is apparently for benchmarks that set the same value repeatedly.
1021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        // It's not clear what benchmarks though, it's also not clear why we don't avoid
1031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        // causing a style recalc when setting the same value to a presentational attribute
1041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        // in the common case.
1051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (body->fastGetAttribute(name) != value)
1061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            body->setAttribute(name, value);
1071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)const AtomicString& HTMLDocument::bgColor() const
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return bodyAttributeValue(bgcolorAttr);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLDocument::setBgColor(const AtomicString& value)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    setBodyAttribute(bgcolorAttr, value);
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)const AtomicString& HTMLDocument::fgColor() const
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return bodyAttributeValue(textAttr);
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLDocument::setFgColor(const AtomicString& value)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    setBodyAttribute(textAttr, value);
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)const AtomicString& HTMLDocument::alinkColor() const
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return bodyAttributeValue(alinkAttr);
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLDocument::setAlinkColor(const AtomicString& value)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    setBodyAttribute(alinkAttr, value);
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)const AtomicString& HTMLDocument::linkColor() const
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return bodyAttributeValue(linkAttr);
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1451e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLDocument::setLinkColor(const AtomicString& value)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    setBodyAttribute(linkAttr, value);
1481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
1491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)const AtomicString& HTMLDocument::vlinkColor() const
1511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
1521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return bodyAttributeValue(vlinkAttr);
1531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
1541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLDocument::setVlinkColor(const AtomicString& value)
1561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
1571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    setBodyAttribute(vlinkAttr, value);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
160d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<Document> HTMLDocument::cloneDocumentWithoutChildren()
161bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
162bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return create(DocumentInit(url()).withRegistrationContext(registrationContext()));
163bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
164bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// --------------------------------------------------------------------------
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// not part of the DOM
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// --------------------------------------------------------------------------
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
169f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void HTMLDocument::addItemToMap(HashCountedSet<AtomicString>& map, const AtomicString& name)
170df95704c49daea886ddad70775bda23618d6274dBen Murdoch{
171df95704c49daea886ddad70775bda23618d6274dBen Murdoch    if (name.isEmpty())
172df95704c49daea886ddad70775bda23618d6274dBen Murdoch        return;
173f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    map.add(name);
174d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (LocalFrame* f = frame())
175f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        f->script().namedItemAdded(this, name);
176df95704c49daea886ddad70775bda23618d6274dBen Murdoch}
177df95704c49daea886ddad70775bda23618d6274dBen Murdoch
178f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void HTMLDocument::removeItemFromMap(HashCountedSet<AtomicString>& map, const AtomicString& name)
179df95704c49daea886ddad70775bda23618d6274dBen Murdoch{
180df95704c49daea886ddad70775bda23618d6274dBen Murdoch    if (name.isEmpty())
181df95704c49daea886ddad70775bda23618d6274dBen Murdoch        return;
182f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    map.remove(name);
183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (LocalFrame* f = frame())
184f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        f->script().namedItemRemoved(this, name);
185df95704c49daea886ddad70775bda23618d6274dBen Murdoch}
186df95704c49daea886ddad70775bda23618d6274dBen Murdoch
187df95704c49daea886ddad70775bda23618d6274dBen Murdochvoid HTMLDocument::addNamedItem(const AtomicString& name)
188df95704c49daea886ddad70775bda23618d6274dBen Murdoch{
189df95704c49daea886ddad70775bda23618d6274dBen Murdoch    addItemToMap(m_namedItemCounts, name);
190df95704c49daea886ddad70775bda23618d6274dBen Murdoch}
191df95704c49daea886ddad70775bda23618d6274dBen Murdoch
192df95704c49daea886ddad70775bda23618d6274dBen Murdochvoid HTMLDocument::removeNamedItem(const AtomicString& name)
193df95704c49daea886ddad70775bda23618d6274dBen Murdoch{
194df95704c49daea886ddad70775bda23618d6274dBen Murdoch    removeItemFromMap(m_namedItemCounts, name);
195df95704c49daea886ddad70775bda23618d6274dBen Murdoch}
196df95704c49daea886ddad70775bda23618d6274dBen Murdoch
197df95704c49daea886ddad70775bda23618d6274dBen Murdochvoid HTMLDocument::addExtraNamedItem(const AtomicString& name)
198df95704c49daea886ddad70775bda23618d6274dBen Murdoch{
199df95704c49daea886ddad70775bda23618d6274dBen Murdoch    addItemToMap(m_extraNamedItemCounts, name);
200df95704c49daea886ddad70775bda23618d6274dBen Murdoch}
201df95704c49daea886ddad70775bda23618d6274dBen Murdoch
202df95704c49daea886ddad70775bda23618d6274dBen Murdochvoid HTMLDocument::removeExtraNamedItem(const AtomicString& name)
203df95704c49daea886ddad70775bda23618d6274dBen Murdoch{
204df95704c49daea886ddad70775bda23618d6274dBen Murdoch    removeItemFromMap(m_extraNamedItemCounts, name);
205df95704c49daea886ddad70775bda23618d6274dBen Murdoch}
206df95704c49daea886ddad70775bda23618d6274dBen Murdoch
20783750176c3ee2cea66c8a9751271026a5901be3aBen Murdochstatic void addLocalNameToSet(HashSet<StringImpl*>* set, const QualifiedName& qName)
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    set->add(qName.localName().impl());
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21283750176c3ee2cea66c8a9751271026a5901be3aBen Murdochstatic HashSet<StringImpl*>* createHtmlCaseInsensitiveAttributesSet()
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // This is the list of attributes in HTML 4.01 with values marked as "[CI]" or case-insensitive
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Mozilla treats all other values as case-sensitive, thus so do we.
21683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    HashSet<StringImpl*>* attrSet = new HashSet<StringImpl*>;
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, accept_charsetAttr);
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, acceptAttr);
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, alignAttr);
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, alinkAttr);
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, axisAttr);
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, bgcolorAttr);
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, charsetAttr);
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, checkedAttr);
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, clearAttr);
227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, codetypeAttr);
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, colorAttr);
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, compactAttr);
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, declareAttr);
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, deferAttr);
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, dirAttr);
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, disabledAttr);
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, enctypeAttr);
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, faceAttr);
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, frameAttr);
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, hreflangAttr);
238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, http_equivAttr);
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, langAttr);
240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, languageAttr);
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, linkAttr);
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, mediaAttr);
243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, methodAttr);
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, multipleAttr);
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, nohrefAttr);
246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, noresizeAttr);
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, noshadeAttr);
248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, nowrapAttr);
249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, readonlyAttr);
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, relAttr);
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, revAttr);
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, rulesAttr);
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, scopeAttr);
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, scrollingAttr);
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, selectedAttr);
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, shapeAttr);
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, targetAttr);
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, textAttr);
259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, typeAttr);
260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, valignAttr);
261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, valuetypeAttr);
262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addLocalNameToSet(attrSet, vlinkAttr);
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return attrSet;
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLDocument::isCaseSensitiveAttribute(const QualifiedName& attributeName)
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
26983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    static HashSet<StringImpl*>* htmlCaseInsensitiveAttributesSet = createHtmlCaseInsensitiveAttributesSet();
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isPossibleHTMLAttr = !attributeName.hasPrefix() && (attributeName.namespaceURI() == nullAtom);
271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return !isPossibleHTMLAttr || !htmlCaseInsensitiveAttributesSet->contains(attributeName.localName().impl());
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void HTMLDocument::write(LocalDOMWindow* callingWindow, const Vector<String>& text, ExceptionState& exceptionState)
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(callingWindow);
27751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    StringBuilder builder;
27851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    for (size_t i = 0; i < text.size(); ++i)
27951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        builder.append(text[i]);
28010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    write(builder.toString(), callingWindow->document(), exceptionState);
28151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
28251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
28376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void HTMLDocument::writeln(LocalDOMWindow* callingWindow, const Vector<String>& text, ExceptionState& exceptionState)
28451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(callingWindow);
28651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    StringBuilder builder;
28751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    for (size_t i = 0; i < text.size(); ++i)
28851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        builder.append(text[i]);
28910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    writeln(builder.toString(), callingWindow->document(), exceptionState);
29051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
29151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
293