2 * Copyright (C) 2010, Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 #ifndef InspectorStyleSheet_h
26 #define InspectorStyleSheet_h
28 #include "core/InspectorTypeBuilder.h"
29 #include "core/css/CSSPropertySourceData.h"
30 #include "core/css/CSSStyleDeclaration.h"
31 #include "core/inspector/InspectorStyleTextEditor.h"
32 #include "platform/JSONValues.h"
33 #include "platform/heap/Handle.h"
34 #include "wtf/HashMap.h"
35 #include "wtf/PassRefPtr.h"
36 #include "wtf/RefPtr.h"
37 #include "wtf/Vector.h"
38 #include "wtf/text/WTFString.h"
40 class ParsedStyleSheet;
46 class CSSStyleDeclaration;
52 class InspectorPageAgent;
53 class InspectorResourceAgent;
54 class InspectorStyleSheetBase;
56 typedef WillBeHeapVector<RefPtrWillBeMember<CSSRule> > CSSRuleVector;
57 typedef String ErrorString;
59 class InspectorCSSId {
66 InspectorCSSId(const String& styleSheetId, unsigned ordinal)
67 : m_styleSheetId(styleSheetId)
72 bool isEmpty() const { return m_styleSheetId.isEmpty(); }
74 const String& styleSheetId() const { return m_styleSheetId; }
75 unsigned ordinal() const { return m_ordinal; }
78 String m_styleSheetId;
82 struct InspectorStyleProperty {
83 ALLOW_ONLY_INLINE_ALLOCATION();
85 explicit InspectorStyleProperty(CSSPropertySourceData sourceData)
86 : sourceData(sourceData)
91 InspectorStyleProperty(CSSPropertySourceData sourceData, bool hasSource)
92 : sourceData(sourceData)
93 , hasSource(hasSource)
97 void setRawTextFromStyleDeclaration(const String& styleDeclaration)
99 unsigned start = sourceData.range.start;
100 unsigned end = sourceData.range.end;
102 ASSERT(end <= styleDeclaration.length());
103 rawText = styleDeclaration.substring(start, end - start);
106 bool hasRawText() const { return !rawText.isEmpty(); }
108 void trace(Visitor* visitor) { visitor->trace(sourceData); }
110 CSSPropertySourceData sourceData;
115 class InspectorStyle FINAL : public RefCountedWillBeGarbageCollectedFinalized<InspectorStyle> {
117 static PassRefPtrWillBeRawPtr<InspectorStyle> create(const InspectorCSSId&, PassRefPtrWillBeRawPtr<CSSStyleDeclaration>, InspectorStyleSheetBase* parentStyleSheet);
119 CSSStyleDeclaration* cssStyle() const { return m_style.get(); }
120 PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForStyle() const;
121 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> > buildArrayForComputedStyle() const;
122 bool setPropertyText(unsigned index, const String& text, bool overwrite, ExceptionState&);
123 bool styleText(String* result) const;
125 void trace(Visitor*);
128 InspectorStyle(const InspectorCSSId&, PassRefPtrWillBeRawPtr<CSSStyleDeclaration>, InspectorStyleSheetBase* parentStyleSheet);
130 bool verifyPropertyText(const String& propertyText, bool canOmitSemicolon);
131 void populateAllProperties(WillBeHeapVector<InspectorStyleProperty>& result) const;
132 PassRefPtr<TypeBuilder::CSS::CSSStyle> styleWithProperties() const;
133 PassRefPtrWillBeRawPtr<CSSRuleSourceData> extractSourceData() const;
134 bool applyStyleText(const String&);
135 String shorthandValue(const String& shorthandProperty) const;
136 NewLineAndWhitespace& newLineAndWhitespaceDelimiters() const;
137 inline Document* ownerDocument() const;
139 InspectorCSSId m_styleId;
140 RefPtrWillBeMember<CSSStyleDeclaration> m_style;
141 RawPtrWillBeMember<InspectorStyleSheetBase> m_parentStyleSheet;
142 mutable std::pair<String, String> m_format;
143 mutable bool m_formatAcquired;
146 class InspectorStyleSheetBase : public RefCountedWillBeGarbageCollectedFinalized<InspectorStyleSheetBase> {
151 virtual ~Listener() { }
152 virtual void styleSheetChanged(InspectorStyleSheetBase*) = 0;
153 virtual void willReparseStyleSheet() = 0;
154 virtual void didReparseStyleSheet() = 0;
156 virtual ~InspectorStyleSheetBase() { }
157 virtual void trace(Visitor*) { }
159 String id() const { return m_id; }
161 virtual Document* ownerDocument() const = 0;
162 virtual bool setText(const String&, ExceptionState&) = 0;
163 virtual bool getText(String* result) const = 0;
164 bool setPropertyText(const InspectorCSSId&, unsigned propertyIndex, const String& text, bool overwrite, ExceptionState&);
166 virtual bool setStyleText(const InspectorCSSId&, const String&) = 0;
167 bool getStyleText(const InspectorCSSId&, String*);
169 virtual CSSStyleDeclaration* styleForId(const InspectorCSSId&) const = 0;
170 virtual InspectorCSSId styleId(CSSStyleDeclaration*) const = 0;
172 PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForStyle(CSSStyleDeclaration*);
173 bool findPropertyByRange(const SourceRange&, InspectorCSSId*, unsigned* propertyIndex, bool* overwrite);
174 bool lineNumberAndColumnToOffset(unsigned lineNumber, unsigned columnNumber, unsigned* offset);
177 InspectorStyleSheetBase(const String& id, Listener*);
179 Listener* listener() const { return m_listener; }
180 void fireStyleSheetChanged();
181 PassOwnPtr<Vector<unsigned> > lineEndings();
183 virtual PassRefPtrWillBeRawPtr<InspectorStyle> inspectorStyleForId(const InspectorCSSId&) = 0;
184 virtual unsigned ruleCount() = 0;
186 // Also accessed by friend class InspectorStyle.
187 virtual PassRefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceDataAt(unsigned) const = 0;
188 virtual bool ensureParsedDataReady() = 0;
191 friend class InspectorStyle;
194 Listener* m_listener;
197 class InspectorStyleSheet : public InspectorStyleSheetBase {
199 static PassRefPtrWillBeRawPtr<InspectorStyleSheet> create(InspectorPageAgent*, InspectorResourceAgent*, const String& id, PassRefPtrWillBeRawPtr<CSSStyleSheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum, const String& documentURL, Listener*);
201 virtual ~InspectorStyleSheet();
202 virtual void trace(Visitor*) OVERRIDE;
204 String finalURL() const;
205 virtual Document* ownerDocument() const OVERRIDE;
206 virtual bool setText(const String&, ExceptionState&) OVERRIDE;
207 virtual bool getText(String* result) const OVERRIDE;
208 String ruleSelector(const InspectorCSSId&, ExceptionState&);
209 bool setRuleSelector(const InspectorCSSId&, const String& selector, ExceptionState&);
210 CSSStyleRule* addRule(const String& ruleText, const SourceRange& location, ExceptionState&);
211 bool deleteRule(const InspectorCSSId&, const String& oldText, ExceptionState&);
213 CSSStyleSheet* pageStyleSheet() const { return m_pageStyleSheet.get(); }
215 PassRefPtr<TypeBuilder::CSS::CSSStyleSheetHeader> buildObjectForStyleSheetInfo() const;
216 PassRefPtr<TypeBuilder::CSS::CSSRule> buildObjectForRule(CSSStyleRule*, PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> >);
218 PassRefPtr<TypeBuilder::CSS::SourceRange> ruleHeaderSourceRange(const CSSRule*);
220 InspectorCSSId ruleId(CSSStyleRule*) const;
221 CSSStyleRule* ruleForId(const InspectorCSSId&) const;
223 virtual InspectorCSSId styleId(CSSStyleDeclaration*) const OVERRIDE;
224 virtual CSSStyleDeclaration* styleForId(const InspectorCSSId&) const OVERRIDE;
225 virtual bool setStyleText(const InspectorCSSId&, const String&) OVERRIDE;
227 bool findRuleBySelectorRange(const SourceRange&, InspectorCSSId*);
229 const CSSRuleVector& flatRules();
232 virtual PassRefPtrWillBeRawPtr<InspectorStyle> inspectorStyleForId(const InspectorCSSId&) OVERRIDE;
233 virtual unsigned ruleCount() OVERRIDE;
235 // Also accessed by friend class InspectorStyle.
236 virtual PassRefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceDataAt(unsigned) const OVERRIDE;
237 virtual bool ensureParsedDataReady() OVERRIDE;
240 InspectorStyleSheet(InspectorPageAgent*, InspectorResourceAgent*, const String& id, PassRefPtrWillBeRawPtr<CSSStyleSheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum, const String& documentURL, Listener*);
241 unsigned ruleIndexBySourceRange(const CSSMediaRule* parentMediaRule, const SourceRange&);
242 CSSStyleRule* insertCSSOMRuleInStyleSheet(const SourceRange&, const String& ruleText, ExceptionState&);
243 CSSStyleRule* insertCSSOMRuleInMediaRule(CSSMediaRule*, const SourceRange&, const String& ruleText, ExceptionState&);
244 CSSStyleRule* insertCSSOMRuleBySourceRange(const SourceRange&, const String& ruleText, ExceptionState&);
245 bool verifyRuleText(const String& ruleText);
246 unsigned ruleIndexByStyle(CSSStyleDeclaration*) const;
247 String sourceMapURL() const;
248 String sourceURL() const;
249 bool ensureText() const;
250 void ensureFlatRules() const;
251 bool styleSheetTextWithChangedStyle(CSSStyleDeclaration*, const String& newStyleText, String* result);
252 bool originalStyleSheetText(String* result) const;
253 bool resourceStyleSheetText(String* result) const;
254 bool inlineStyleSheetText(String* result) const;
255 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::Selector> > selectorsFromSource(const CSSRuleSourceData*, const String&);
256 PassRefPtr<TypeBuilder::CSS::SelectorList> buildObjectForSelectorList(CSSStyleRule*);
258 bool hasSourceURL() const;
259 bool startsAtZero() const;
261 void updateText(const String& newText);
262 Element* ownerStyleElement() const;
264 RawPtrWillBeMember<InspectorPageAgent> m_pageAgent;
265 RawPtrWillBeMember<InspectorResourceAgent> m_resourceAgent;
266 RefPtrWillBeMember<CSSStyleSheet> m_pageStyleSheet;
267 TypeBuilder::CSS::StyleSheetOrigin::Enum m_origin;
268 String m_documentURL;
269 OwnPtr<ParsedStyleSheet> m_parsedStyleSheet;
270 mutable CSSRuleVector m_flatRules;
271 mutable String m_sourceURL;
274 class InspectorStyleSheetForInlineStyle FINAL : public InspectorStyleSheetBase {
276 static PassRefPtrWillBeRawPtr<InspectorStyleSheetForInlineStyle> create(const String& id, PassRefPtrWillBeRawPtr<Element>, Listener*);
278 void didModifyElementAttribute();
279 virtual Document* ownerDocument() const OVERRIDE;
280 virtual bool setText(const String&, ExceptionState&) OVERRIDE;
281 virtual bool getText(String* result) const OVERRIDE;
283 virtual CSSStyleDeclaration* styleForId(const InspectorCSSId& id) const OVERRIDE { ASSERT_UNUSED(id, !id.ordinal()); return inlineStyle(); }
284 virtual InspectorCSSId styleId(CSSStyleDeclaration* style) const OVERRIDE { return InspectorCSSId(id(), 0); }
285 virtual bool setStyleText(const InspectorCSSId&, const String&) OVERRIDE;
287 virtual void trace(Visitor*) OVERRIDE;
290 virtual PassRefPtrWillBeRawPtr<InspectorStyle> inspectorStyleForId(const InspectorCSSId&) OVERRIDE;
291 virtual unsigned ruleCount() OVERRIDE { return 1; }
293 // Also accessed by friend class InspectorStyle.
294 virtual bool ensureParsedDataReady() OVERRIDE;
295 virtual PassRefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceDataAt(unsigned ruleIndex) const OVERRIDE { ASSERT_UNUSED(ruleIndex, !ruleIndex); return m_ruleSourceData; }
298 InspectorStyleSheetForInlineStyle(const String& id, PassRefPtrWillBeRawPtr<Element>, Listener*);
299 CSSStyleDeclaration* inlineStyle() const;
300 const String& elementStyleText() const;
301 PassRefPtrWillBeRawPtr<CSSRuleSourceData> getStyleAttributeData() const;
303 RefPtrWillBeMember<Element> m_element;
304 RefPtrWillBeMember<CSSRuleSourceData> m_ruleSourceData;
305 RefPtrWillBeMember<InspectorStyle> m_inspectorStyle;
307 // Contains "style" attribute value.
308 mutable String m_styleText;
309 mutable bool m_isStyleTextValid;
315 WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::InspectorStyleProperty);
317 #endif // !defined(InspectorStyleSheet_h)