15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010, Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef InspectorStyleSheet_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define InspectorStyleSheet_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/InspectorTypeBuilder.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSPropertySourceData.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSStyleDeclaration.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorStyleTextEditor.h"
321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/JSONValues.h"
33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/heap/Handle.h"
34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashMap.h"
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassRefPtr.h"
36591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/RefPtr.h"
37591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Vector.h"
38591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/WTFString.h"
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ParsedStyleSheet;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class CSSMediaRule;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSRuleList;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSStyleDeclaration;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSStyleRule;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSStyleSheet;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Document;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Element;
51df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorPageAgent;
5306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)class InspectorResourceAgent;
5443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)class InspectorStyleSheetBase;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)typedef WillBeHeapVector<RefPtrWillBeMember<CSSRule> > CSSRuleVector;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef String ErrorString;
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSId {
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorCSSId()
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_ordinal(0)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorCSSId(const String& styleSheetId, unsigned ordinal)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_styleSheetId(styleSheetId)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_ordinal(ordinal)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isEmpty() const { return m_styleSheetId.isEmpty(); }
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& styleSheetId() const { return m_styleSheetId; }
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned ordinal() const { return m_ordinal; }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_styleSheetId;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_ordinal;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct InspectorStyleProperty {
83aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    ALLOW_ONLY_INLINE_ALLOCATION();
84aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochpublic:
8553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    explicit InspectorStyleProperty(CSSPropertySourceData sourceData)
8653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        : sourceData(sourceData)
8753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        , hasSource(true)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    InspectorStyleProperty(CSSPropertySourceData sourceData, bool hasSource)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : sourceData(sourceData)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , hasSource(hasSource)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasRawText() const { return !rawText.isEmpty(); }
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
99aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    void trace(Visitor* visitor) { visitor->trace(sourceData); }
100aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSPropertySourceData sourceData;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasSource;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String rawText;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class InspectorStyle FINAL : public RefCountedWillBeGarbageCollectedFinalized<InspectorStyle> {
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
108c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static PassRefPtrWillBeRawPtr<InspectorStyle> create(const InspectorCSSId&, PassRefPtrWillBeRawPtr<CSSStyleDeclaration>, InspectorStyleSheetBase* parentStyleSheet);
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSStyleDeclaration* cssStyle() const { return m_style.get(); }
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForStyle() const;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> > buildArrayForComputedStyle() const;
11307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool setPropertyText(unsigned index, const String& text, bool overwrite, ExceptionState&);
11453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool styleText(String* result) const;
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool textForRange(const SourceRange&, String* result) const;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void trace(Visitor*);
118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
120323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    InspectorStyle(const InspectorCSSId&, PassRefPtrWillBeRawPtr<CSSStyleDeclaration>, InspectorStyleSheetBase* parentStyleSheet);
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool verifyPropertyText(const String& propertyText, bool canOmitSemicolon);
123aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    void populateAllProperties(WillBeHeapVector<InspectorStyleProperty>& result) const;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<TypeBuilder::CSS::CSSStyle> styleWithProperties() const;
125aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    PassRefPtrWillBeRawPtr<CSSRuleSourceData> extractSourceData() const;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool applyStyleText(const String&);
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String shorthandValue(const String& shorthandProperty) const;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NewLineAndWhitespace& newLineAndWhitespaceDelimiters() const;
12953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    inline Document* ownerDocument() const;
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorCSSId m_styleId;
132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeMember<CSSStyleDeclaration> m_style;
133c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<InspectorStyleSheetBase> m_parentStyleSheet;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable std::pair<String, String> m_format;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable bool m_formatAcquired;
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class InspectorStyleSheetBase : public RefCountedWillBeGarbageCollectedFinalized<InspectorStyleSheetBase> {
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    class Listener {
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Listener() { }
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual ~Listener() { }
14443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        virtual void styleSheetChanged(InspectorStyleSheetBase*) = 0;
1457757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        virtual void willReparseStyleSheet() = 0;
1467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        virtual void didReparseStyleSheet() = 0;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
14843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual ~InspectorStyleSheetBase() { }
149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void trace(Visitor*) { }
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    String id() const { return m_id; }
15243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
15343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual Document* ownerDocument() const = 0;
15443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual bool setText(const String&, ExceptionState&) = 0;
15543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual bool getText(String* result) const = 0;
15607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool setPropertyText(const InspectorCSSId&, unsigned propertyIndex, const String& text, bool overwrite, ExceptionState&);
15707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
15807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    virtual bool setStyleText(const InspectorCSSId&, const String&) = 0;
15907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool getStyleText(const InspectorCSSId&, String*);
16043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
16143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual CSSStyleDeclaration* styleForId(const InspectorCSSId&) const = 0;
16243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual InspectorCSSId styleId(CSSStyleDeclaration*) const = 0;
16343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
16443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForStyle(CSSStyleDeclaration*);
165a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    bool findPropertyByRange(const SourceRange&, InspectorCSSId*, unsigned* propertyIndex, bool* overwrite);
166a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    bool lineNumberAndColumnToOffset(unsigned lineNumber, unsigned columnNumber, unsigned* offset);
16743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
16843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)protected:
16943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    InspectorStyleSheetBase(const String& id, Listener*);
17043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
17143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    Listener* listener() const { return m_listener; }
17243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    void fireStyleSheetChanged();
17343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    PassOwnPtr<Vector<unsigned> > lineEndings();
17443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
175c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual PassRefPtrWillBeRawPtr<InspectorStyle> inspectorStyleForId(const InspectorCSSId&) = 0;
176a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    virtual unsigned ruleCount() = 0;
17743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
17843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // Also accessed by friend class InspectorStyle.
179a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    virtual PassRefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceDataAt(unsigned) const = 0;
18043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual bool ensureParsedDataReady() = 0;
18143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
18243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)private:
18343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    friend class InspectorStyle;
18443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
18543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    String m_id;
18643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    Listener* m_listener;
18743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)};
18843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
18943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)class InspectorStyleSheet : public InspectorStyleSheetBase {
19043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)public:
191c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static PassRefPtrWillBeRawPtr<InspectorStyleSheet> create(InspectorPageAgent*, InspectorResourceAgent*, const String& id, PassRefPtrWillBeRawPtr<CSSStyleSheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum, const String& documentURL, Listener*);
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~InspectorStyleSheet();
194c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String finalURL() const;
19743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual Document* ownerDocument() const OVERRIDE;
19843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual bool setText(const String&, ExceptionState&) OVERRIDE;
19943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual bool getText(String* result) const OVERRIDE;
200df95704c49daea886ddad70775bda23618d6274dBen Murdoch    String ruleSelector(const InspectorCSSId&, ExceptionState&);
201df95704c49daea886ddad70775bda23618d6274dBen Murdoch    bool setRuleSelector(const InspectorCSSId&, const String& selector, ExceptionState&);
202e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    CSSStyleRule* addRule(const String& ruleText, const SourceRange& location, ExceptionState&);
203e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    bool deleteRule(const InspectorCSSId&, const String& oldText, ExceptionState&);
20443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
20543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    CSSStyleSheet* pageStyleSheet() const { return m_pageStyleSheet.get(); }
206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
20781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    PassRefPtr<TypeBuilder::CSS::CSSStyleSheetHeader> buildObjectForStyleSheetInfo() const;
208521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    PassRefPtr<TypeBuilder::CSS::CSSRule> buildObjectForRule(CSSStyleRule*, PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> >);
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
210521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    PassRefPtr<TypeBuilder::CSS::SourceRange> ruleHeaderSourceRange(const CSSRule*);
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorCSSId ruleId(CSSStyleRule*) const;
21343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    CSSStyleRule* ruleForId(const InspectorCSSId&) const;
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual InspectorCSSId styleId(CSSStyleDeclaration*) const OVERRIDE;
21643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual CSSStyleDeclaration* styleForId(const InspectorCSSId&) const OVERRIDE;
21707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    virtual bool setStyleText(const InspectorCSSId&, const String&) OVERRIDE;
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
219a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    bool findRuleBySelectorRange(const SourceRange&, InspectorCSSId*);
220a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
221f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    const CSSRuleVector& flatRules();
222f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
22343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)protected:
224c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual PassRefPtrWillBeRawPtr<InspectorStyle> inspectorStyleForId(const InspectorCSSId&) OVERRIDE;
225a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    virtual unsigned ruleCount() OVERRIDE;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Also accessed by friend class InspectorStyle.
228a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    virtual PassRefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceDataAt(unsigned) const OVERRIDE;
22943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual bool ensureParsedDataReady() OVERRIDE;
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
23243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    InspectorStyleSheet(InspectorPageAgent*, InspectorResourceAgent*, const String& id, PassRefPtrWillBeRawPtr<CSSStyleSheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum, const String& documentURL, Listener*);
233e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    unsigned ruleIndexBySourceRange(const CSSMediaRule* parentMediaRule, const SourceRange&);
234e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    CSSStyleRule* insertCSSOMRuleInStyleSheet(const SourceRange&, const String& ruleText, ExceptionState&);
235e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    CSSStyleRule* insertCSSOMRuleInMediaRule(CSSMediaRule*, const SourceRange&, const String& ruleText, ExceptionState&);
236e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    CSSStyleRule* insertCSSOMRuleBySourceRange(const SourceRange&, const String& ruleText, ExceptionState&);
237e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    bool verifyRuleText(const String& ruleText);
23843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    unsigned ruleIndexByStyle(CSSStyleDeclaration*) const;
23943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    String sourceMapURL() const;
24043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    String sourceURL() const;
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool ensureText() const;
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void ensureFlatRules() const;
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool styleSheetTextWithChangedStyle(CSSStyleDeclaration*, const String& newStyleText, String* result);
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool originalStyleSheetText(String* result) const;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool resourceStyleSheetText(String* result) const;
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inlineStyleSheetText(String* result) const;
24743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::Selector> > selectorsFromSource(const CSSRuleSourceData*, const String&);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<TypeBuilder::CSS::SelectorList> buildObjectForSelectorList(CSSStyleRule*);
24993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    String url() const;
25093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    bool hasSourceURL() const;
25193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    bool startsAtZero() const;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
253197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void updateText(const String& newText);
254197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    Element* ownerStyleElement() const;
255197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
256c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<InspectorPageAgent> m_pageAgent;
257c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<InspectorResourceAgent> m_resourceAgent;
258c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeMember<CSSStyleSheet> m_pageStyleSheet;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TypeBuilder::CSS::StyleSheetOrigin::Enum m_origin;
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_documentURL;
261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    OwnPtr<ParsedStyleSheet> m_parsedStyleSheet;
262521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    mutable CSSRuleVector m_flatRules;
26393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    mutable String m_sourceURL;
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)class InspectorStyleSheetForInlineStyle FINAL : public InspectorStyleSheetBase {
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
268c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static PassRefPtrWillBeRawPtr<InspectorStyleSheetForInlineStyle> create(const String& id, PassRefPtrWillBeRawPtr<Element>, Listener*);
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void didModifyElementAttribute();
271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual Document* ownerDocument() const OVERRIDE;
27209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool setText(const String&, ExceptionState&) OVERRIDE;
27309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool getText(String* result) const OVERRIDE;
27443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
27509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual CSSStyleDeclaration* styleForId(const InspectorCSSId& id) const OVERRIDE { ASSERT_UNUSED(id, !id.ordinal()); return inlineStyle(); }
27643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual InspectorCSSId styleId(CSSStyleDeclaration* style) const OVERRIDE { return InspectorCSSId(id(), 0); }
27707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    virtual bool setStyleText(const InspectorCSSId&, const String&) OVERRIDE;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
279c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
280c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
282c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual PassRefPtrWillBeRawPtr<InspectorStyle> inspectorStyleForId(const InspectorCSSId&) OVERRIDE;
283a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    virtual unsigned ruleCount() OVERRIDE { return 1; }
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Also accessed by friend class InspectorStyle.
28643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual bool ensureParsedDataReady() OVERRIDE;
287a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    virtual PassRefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceDataAt(unsigned ruleIndex) const OVERRIDE { ASSERT_UNUSED(ruleIndex, !ruleIndex); return m_ruleSourceData; }
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
290f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    InspectorStyleSheetForInlineStyle(const String& id, PassRefPtrWillBeRawPtr<Element>, Listener*);
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSStyleDeclaration* inlineStyle() const;
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& elementStyleText() const;
293aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    PassRefPtrWillBeRawPtr<CSSRuleSourceData> getStyleAttributeData() const;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeMember<Element> m_element;
296c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeMember<CSSRuleSourceData> m_ruleSourceData;
297c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeMember<InspectorStyle> m_inspectorStyle;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Contains "style" attribute value.
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable String m_styleText;
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable bool m_isStyleTextValid;
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
307c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::InspectorStyleProperty);
308aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // !defined(InspectorStyleSheet_h)
310