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) * (C) 2001 Dirk Mueller (mueller@kde.org) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLScriptElement.h" 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h" 27df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionStatePlaceholder.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptEventListener.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attribute.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 31e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/dom/ScriptLoader.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Text.h" 331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/Event.h" 341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/ThreadLocalEventNames.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline HTMLScriptElement::HTMLScriptElement(Document& document, bool wasInsertedByParser, bool alreadyStarted) 4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : HTMLElement(scriptTag, document) 42e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch , m_loader(ScriptLoader::create(this, wasInsertedByParser, alreadyStarted)) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ScriptWrappable::init(this); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)PassRefPtr<HTMLScriptElement> HTMLScriptElement::create(Document& document, bool wasInsertedByParser, bool alreadyStarted) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return adoptRef(new HTMLScriptElement(document, wasInsertedByParser, alreadyStarted)); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLScriptElement::isURLAttribute(const Attribute& attribute) const 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return attribute.name() == srcAttr || HTMLElement::isURLAttribute(attribute); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLScriptElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta); 60e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_loader->childrenChanged(); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLScriptElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (name == srcAttr) 66e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_loader->handleSourceAttribute(value); 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (name == asyncAttr) 68e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_loader->handleAsyncAttribute(); 69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (name == onbeforeloadAttr) 701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) setAttributeEventListener(EventTypeNames::beforeload, createAttributeEventListener(this, name, value)); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLElement::parseAttribute(name, value); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::InsertionNotificationRequest HTMLScriptElement::insertedInto(ContainerNode* insertionPoint) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::insertedInto(insertionPoint); 788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return InsertionShouldCallDidNotifySubtreeInsertions; 798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} 808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void HTMLScriptElement::didNotifySubtreeInsertionsToDocument() 828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){ 838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_loader->didNotifySubtreeInsertionsToDocument(); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLScriptElement::setText(const String &value) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<Node> protectFromMutationEvents(this); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (hasOneTextChild()) { 91521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) toText(firstChild())->setData(value); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) removeChildren(); 968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) appendChild(document().createTextNode(value.impl()), IGNORE_EXCEPTION); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLScriptElement::setAsync(bool async) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setBooleanAttribute(asyncAttr, async); 102e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_loader->handleAsyncAttribute(); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLScriptElement::async() const 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 107e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return fastHasAttribute(asyncAttr) || (m_loader->forceAsync()); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KURL HTMLScriptElement::src() const 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return document().completeURL(sourceAttributeValue()); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLScriptElement::addSubresourceAttributeURLs(ListHashSet<KURL>& urls) const 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::addSubresourceAttributeURLs(urls); 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) addSubresourceURL(urls, src()); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLScriptElement::sourceAttributeValue() const 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getAttribute(srcAttr).string(); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLScriptElement::charsetAttributeValue() const 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getAttribute(charsetAttr).string(); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLScriptElement::typeAttributeValue() const 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getAttribute(typeAttr).string(); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLScriptElement::languageAttributeValue() const 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getAttribute(languageAttr).string(); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLScriptElement::forAttributeValue() const 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getAttribute(forAttr).string(); 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLScriptElement::eventAttributeValue() const 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getAttribute(eventAttr).string(); 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLScriptElement::asyncAttributeValue() const 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return fastHasAttribute(asyncAttr); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLScriptElement::deferAttributeValue() const 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return fastHasAttribute(deferAttr); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLScriptElement::hasSourceAttribute() const 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return fastHasAttribute(srcAttr); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLScriptElement::dispatchLoadEvent() 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 169e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ASSERT(!m_loader->haveFiredLoadEvent()); 1701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) dispatchEvent(Event::create(EventTypeNames::load)); 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Element> HTMLScriptElement::cloneElementWithoutAttributesAndChildren() 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return adoptRef(new HTMLScriptElement(document(), false, m_loader->alreadyStarted())); 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 179