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, 2010 Apple Inc. All rights reserved. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2007 Rob Buis (buis@kde.org) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLStyleElement.h" 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/MediaList.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 3006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/Event.h" 3106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/EventSender.h" 32e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static StyleEventSender& styleLoadEventSender() 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) DEFINE_STATIC_LOCAL(StyleEventSender, sharedLoadEventSender, (EventTypeNames::load)); 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return sharedLoadEventSender; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline HTMLStyleElement::HTMLStyleElement(Document& document, bool createdByParser) 4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : HTMLElement(styleTag, document) 468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) , StyleElement(&document, createdByParser) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_firedLoad(false) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_loadedSheet(false) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLStyleElement::~HTMLStyleElement() 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 54323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StyleElement::clearDocumentData(document(), this); 56f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) styleLoadEventSender().cancelEvent(this); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLStyleElement> HTMLStyleElement::create(Document& document, bool createdByParser) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return adoptRefWillBeNoop(new HTMLStyleElement(document, createdByParser)); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLStyleElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 68e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (name == titleAttr && m_sheet) { 69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_sheet->setTitle(value); 701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } else if (name == mediaAttr && inDocument() && document().isActive() && m_sheet) { 715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_sheet->setMediaQueries(MediaQuerySet::create(value)); 72d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) document().modifiedStyleSheet(m_sheet.get()); 73e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } else { 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLElement::parseAttribute(name, value); 75e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLStyleElement::finishParsingChildren() 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StyleElement::finishParsingChildren(this); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::finishParsingChildren(); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::InsertionNotificationRequest HTMLStyleElement::insertedInto(ContainerNode* insertionPoint) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::insertedInto(insertionPoint); 875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (insertionPoint->inDocument() && isInShadowTree()) { 885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (ShadowRoot* scope = containingShadowRoot()) 895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) scope->registerScopedHTMLStyleChild(); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return InsertionShouldCallDidNotifySubtreeInsertions; 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLStyleElement::removedFrom(ContainerNode* insertionPoint) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::removedFrom(insertionPoint); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!insertionPoint->inDocument()) 995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ShadowRoot* scopingNode = containingShadowRoot(); 1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!scopingNode) 1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) scopingNode = insertionPoint->containingShadowRoot(); 1045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (scopingNode) 1065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) scopingNode->unregisterScopedHTMLStyleChild(); 1075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) TreeScope* containingScope = containingShadowRoot(); 1095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) StyleElement::removedFromDocument(document(), this, scopingNode, containingScope ? *containingScope : insertionPoint->treeScope()); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void HTMLStyleElement::didNotifySubtreeInsertionsToDocument() 1135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) StyleElement::processStyleSheet(document(), this); 1155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 1165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 117197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid HTMLStyleElement::childrenChanged(const ChildrenChange& change) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch HTMLElement::childrenChanged(change); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StyleElement::childrenChanged(this); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& HTMLStyleElement::media() const 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getAttribute(mediaAttr); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& HTMLStyleElement::type() const 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getAttribute(typeAttr); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 133521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)ContainerNode* HTMLStyleElement::scopingNode() 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 135521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!inDocument()) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (isInShadowTree()) 139521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return containingShadowRoot(); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return &document(); 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLStyleElement::dispatchPendingLoadEvents() 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) styleLoadEventSender().dispatchPendingEvents(); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLStyleElement::dispatchPendingEvent(StyleEventSender* eventSender) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_UNUSED(eventSender, eventSender == &styleLoadEventSender()); 1521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) dispatchEvent(Event::create(m_loadedSheet ? EventTypeNames::load : EventTypeNames::error)); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLStyleElement::notifyLoadedSheetAndAllCriticalSubresources(bool errorOccurred) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_firedLoad) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_loadedSheet = !errorOccurred; 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) styleLoadEventSender().dispatchEventSoon(this); 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_firedLoad = true; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLStyleElement::disabled() const 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_sheet) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_sheet->disabled(); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLStyleElement::setDisabled(bool setDisabled) 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (CSSStyleSheet* styleSheet = sheet()) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) styleSheet->setDisabled(setDisabled); 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 178323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void HTMLStyleElement::trace(Visitor* visitor) 179323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 180323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) StyleElement::trace(visitor); 181323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) HTMLElement::trace(visitor); 182323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 183323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 185