15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999-2003 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef CSSStyleSheet_h
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define CSSStyleSheet_h
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSRule.h"
2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheet.h"
2693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/Noncopyable.h"
2793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/text/TextPosition.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSCharsetRule;
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSImportRule;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSParser;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSRule;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSRuleList;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSStyleSheet;
37e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass CSSStyleSheetResource;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Document;
39df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MediaQuerySet;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SecurityOrigin;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StyleSheetContents;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSStyleSheet : public StyleSheet {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<CSSStyleSheet> create(PassRefPtr<StyleSheetContents>, CSSImportRule* ownerRule = 0);
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<CSSStyleSheet> create(PassRefPtr<StyleSheetContents>, Node* ownerNode);
4893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    static PassRefPtr<CSSStyleSheet> createInline(Node*, const KURL&, const TextPosition& startPosition = TextPosition::minimumPosition(), const String& encoding = String());
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~CSSStyleSheet();
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual CSSStyleSheet* parentStyleSheet() const OVERRIDE;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual Node* ownerNode() const OVERRIDE { return m_ownerNode; }
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual MediaList* media() const OVERRIDE;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String href() const OVERRIDE;
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String title() const OVERRIDE { return m_title; }
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool disabled() const OVERRIDE { return m_isDisabled; }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void setDisabled(bool) OVERRIDE;
5902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<CSSRuleList> cssRules();
61df95704c49daea886ddad70775bda23618d6274dBen Murdoch    unsigned insertRule(const String& rule, unsigned index, ExceptionState&);
62df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void deleteRule(unsigned index, ExceptionState&);
6302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // IE Extensions
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<CSSRuleList> rules();
66df95704c49daea886ddad70775bda23618d6274dBen Murdoch    int addRule(const String& selector, const String& style, int index, ExceptionState&);
67df95704c49daea886ddad70775bda23618d6274dBen Murdoch    int addRule(const String& selector, const String& style, ExceptionState&);
68df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void removeRule(unsigned index, ExceptionState& es) { deleteRule(index, es); }
6902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For CSSRuleList.
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() const;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSRule* item(unsigned index);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void clearOwnerNode() OVERRIDE { didMutate(); m_ownerNode = 0; }
75e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    virtual CSSRule* ownerRule() const OVERRIDE { return m_ownerRule; }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual KURL baseURL() const OVERRIDE;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isLoading() const OVERRIDE;
7802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearOwnerRule() { m_ownerRule = 0; }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* ownerDocument() const;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MediaQuerySet* mediaQueries() const { return m_mediaQueries.get(); }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMediaQueries(PassRefPtr<MediaQuerySet>);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setTitle(const String& title) { m_title = title; }
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    class RuleMutationScope {
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WTF_MAKE_NONCOPYABLE(RuleMutationScope);
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RuleMutationScope(CSSStyleSheet*);
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RuleMutationScope(CSSRule*);
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ~RuleMutationScope();
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSSStyleSheet* m_styleSheet;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void willMutateRules();
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void didMutateRules();
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void didMutate();
9902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearChildRuleCSSOMWrappers();
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void reattachChildRuleCSSOMWrappers();
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleSheetContents* contents() const { return m_contents.get(); }
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    bool isInline() const { return m_isInlineStylesheet; }
10693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    TextPosition startPositionInSource() const { return m_startPosition; }
10793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSStyleSheet(PassRefPtr<StyleSheetContents>, CSSImportRule* ownerRule);
11093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    CSSStyleSheet(PassRefPtr<StyleSheetContents>, Node* ownerNode, bool isInlineStylesheet, const TextPosition& startPosition);
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isCSSStyleSheet() const { return true; }
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String type() const { return "text/css"; }
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canAccessRules() const;
11602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<StyleSheetContents> m_contents;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_isInlineStylesheet;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_isDisabled;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_title;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<MediaQuerySet> m_mediaQueries;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* m_ownerNode;
124e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    CSSRule* m_ownerRule;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    TextPosition m_startPosition;
12793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable RefPtr<MediaList> m_mediaCSSOMWrapper;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable Vector<RefPtr<CSSRule> > m_childRuleCSSOMWrappers;
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable OwnPtr<CSSRuleList> m_ruleListCSSOMWrapper;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline CSSStyleSheet::RuleMutationScope::RuleMutationScope(CSSStyleSheet* sheet)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_styleSheet(sheet)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_styleSheet)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_styleSheet->willMutateRules();
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline CSSStyleSheet::RuleMutationScope::RuleMutationScope(CSSRule* rule)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_styleSheet(rule ? rule->parentStyleSheet() : 0)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_styleSheet)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_styleSheet->willMutateRules();
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline CSSStyleSheet::RuleMutationScope::~RuleMutationScope()
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_styleSheet)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_styleSheet->didMutateRules();
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
156