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 InspectorCSSAgent_h
26 #define InspectorCSSAgent_h
28 #include "core/css/CSSSelector.h"
29 #include "core/dom/SecurityContext.h"
30 #include "core/frame/ContentSecurityPolicy.h"
31 #include "core/inspector/InspectorBaseAgent.h"
32 #include "core/inspector/InspectorDOMAgent.h"
33 #include "core/inspector/InspectorStyleSheet.h"
34 #include "platform/JSONValues.h"
35 #include "wtf/HashCountedSet.h"
36 #include "wtf/HashMap.h"
37 #include "wtf/HashSet.h"
38 #include "wtf/PassRefPtr.h"
39 #include "wtf/RefPtr.h"
40 #include "wtf/Vector.h"
41 #include "wtf/text/WTFString.h"
45 class ChangeRegionOversetTask;
46 struct CSSParserString;
53 class InspectorFrontend;
54 class InspectorResourceAgent;
55 class InstrumentingAgents;
59 class PlatformFontUsage;
62 class UpdateRegionLayoutTask;
64 class InspectorCSSAgent FINAL
65 : public InspectorBaseAgent<InspectorCSSAgent>
66 , public InspectorDOMAgent::DOMListener
67 , public InspectorBackendDispatcher::CSSCommandHandler
68 , public InspectorStyleSheet::Listener {
69 WTF_MAKE_NONCOPYABLE(InspectorCSSAgent);
71 enum MediaListSource {
72 MediaListSourceLinkedSheet,
73 MediaListSourceInlineSheet,
74 MediaListSourceMediaRule,
75 MediaListSourceImportRule
78 enum StyleSheetsUpdateType {
79 InitialFrontendLoad = 0,
80 ExistingFrontendRefresh,
83 class InlineStyleOverrideScope {
85 InlineStyleOverrideScope(SecurityContext* context)
86 : m_contentSecurityPolicy(context->contentSecurityPolicy())
88 m_contentSecurityPolicy->setOverrideAllowInlineStyle(true);
91 ~InlineStyleOverrideScope()
93 m_contentSecurityPolicy->setOverrideAllowInlineStyle(false);
97 ContentSecurityPolicy* m_contentSecurityPolicy;
100 static CSSStyleRule* asCSSStyleRule(CSSRule*);
102 static PassOwnPtr<InspectorCSSAgent> create(InspectorDOMAgent* domAgent, InspectorPageAgent* pageAgent, InspectorResourceAgent* resourceAgent)
104 return adoptPtr(new InspectorCSSAgent(domAgent, pageAgent, resourceAgent));
106 virtual ~InspectorCSSAgent();
108 bool forcePseudoState(Element*, CSSSelector::PseudoType);
109 virtual void setFrontend(InspectorFrontend*) OVERRIDE;
110 virtual void clearFrontend() OVERRIDE;
111 virtual void discardAgent() OVERRIDE;
112 virtual void restore() OVERRIDE;
113 virtual void enable(ErrorString*, PassRefPtr<EnableCallback>) OVERRIDE;
114 virtual void disable(ErrorString*) OVERRIDE;
116 void didCommitLoad(Frame*, DocumentLoader*);
117 void mediaQueryResultChanged();
118 void didCreateNamedFlow(Document*, NamedFlow*);
119 void willRemoveNamedFlow(Document*, NamedFlow*);
120 void willMutateRules();
121 void didMutateRules(CSSStyleSheet*);
122 void willMutateStyle();
123 void didMutateStyle(CSSStyleDeclaration*, bool);
126 void regionLayoutUpdated(NamedFlow*, int documentNodeId);
127 void regionOversetChanged(NamedFlow*, int documentNodeId);
130 void didUpdateRegionLayout(Document*, NamedFlow*);
131 void didChangeRegionOverset(Document*, NamedFlow*);
133 void activeStyleSheetsUpdated(Document*);
134 void frameDetachedFromParent(Frame*);
136 virtual void getComputedStyleForNode(ErrorString*, int nodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> >&) OVERRIDE;
137 virtual void getPlatformFontsForNode(ErrorString*, int nodeId, String* cssFamilyName, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PlatformFontUsage> >&) OVERRIDE;
138 virtual void getInlineStylesForNode(ErrorString*, int nodeId, RefPtr<TypeBuilder::CSS::CSSStyle>& inlineStyle, RefPtr<TypeBuilder::CSS::CSSStyle>& attributes) OVERRIDE;
139 virtual void getMatchedStylesForNode(ErrorString*, int nodeId, const bool* includePseudo, const bool* includeInherited, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::RuleMatch> >& matchedCSSRules, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PseudoIdMatches> >&, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::InheritedStyleEntry> >& inheritedEntries) OVERRIDE;
140 virtual void getAllStyleSheets(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader> >& styleSheetInfos) OVERRIDE;
141 virtual void getStyleSheet(ErrorString*, const String& styleSheetId, RefPtr<TypeBuilder::CSS::CSSStyleSheetBody>& result) OVERRIDE;
142 virtual void getStyleSheetText(ErrorString*, const String& styleSheetId, String* result) OVERRIDE;
143 virtual void setStyleSheetText(ErrorString*, const String& styleSheetId, const String& text) OVERRIDE;
144 virtual void setStyleText(ErrorString*, const RefPtr<JSONObject>& styleId, const String& text, RefPtr<TypeBuilder::CSS::CSSStyle>& result) OVERRIDE;
145 virtual void setPropertyText(ErrorString*, const RefPtr<JSONObject>& styleId, int propertyIndex, const String& text, bool overwrite, RefPtr<TypeBuilder::CSS::CSSStyle>& result) OVERRIDE;
146 virtual void toggleProperty(ErrorString*, const RefPtr<JSONObject>& styleId, int propertyIndex, bool disable, RefPtr<TypeBuilder::CSS::CSSStyle>& result) OVERRIDE;
147 virtual void setRuleSelector(ErrorString*, const RefPtr<JSONObject>& ruleId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result) OVERRIDE;
148 virtual void addRule(ErrorString*, int contextNodeId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result) OVERRIDE;
149 virtual void getSupportedCSSProperties(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSPropertyInfo> >& result) OVERRIDE;
150 virtual void forcePseudoState(ErrorString*, int nodeId, const RefPtr<JSONArray>& forcedPseudoClasses) OVERRIDE;
151 virtual void getNamedFlowCollection(ErrorString*, int documentNodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::NamedFlow> >& result) OVERRIDE;
153 PassRefPtr<TypeBuilder::CSS::CSSMedia> buildMediaObject(const MediaList*, MediaListSource, const String&, CSSStyleSheet*);
154 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> > buildMediaListChain(CSSRule*);
157 class StyleSheetAction;
158 class SetStyleSheetTextAction;
159 class SetStyleTextAction;
160 class SetPropertyTextAction;
161 class TogglePropertyAction;
162 class SetRuleSelectorAction;
164 class EnableResourceClient;
166 InspectorCSSAgent(InspectorDOMAgent*, InspectorPageAgent*, InspectorResourceAgent*);
168 typedef HashMap<String, RefPtr<InspectorStyleSheet> > IdToInspectorStyleSheet;
169 typedef HashMap<Node*, RefPtr<InspectorStyleSheetForInlineStyle> > NodeToInspectorStyleSheet; // bogus "stylesheets" with elements' inline styles
170 typedef HashMap<int, unsigned> NodeIdToForcedPseudoState;
172 void wasEnabled(PassRefPtr<EnableCallback>);
173 void resetNonPersistentData();
174 InspectorStyleSheetForInlineStyle* asInspectorStyleSheet(Element* element);
175 Element* elementForId(ErrorString*, int nodeId);
176 int documentNodeWithRequestedFlowsId(Document*);
177 void collectAllStyleSheets(Vector<InspectorStyleSheet*>&);
178 void collectAllDocumentStyleSheets(Document*, Vector<CSSStyleSheet*>&);
179 void collectStyleSheets(CSSStyleSheet*, Vector<CSSStyleSheet*>&);
181 void updateActiveStyleSheetsForDocument(Document*, StyleSheetsUpdateType);
182 void updateActiveStyleSheets(Frame*, const Vector<CSSStyleSheet*>&, StyleSheetsUpdateType);
184 void collectPlatformFontsForRenderer(RenderText*, HashCountedSet<String>*);
186 InspectorStyleSheet* bindStyleSheet(CSSStyleSheet*);
187 String unbindStyleSheet(InspectorStyleSheet*);
188 InspectorStyleSheet* viaInspectorStyleSheet(Document*, bool createIfAbsent);
189 InspectorStyleSheet* assertStyleSheetForId(ErrorString*, const String&);
190 TypeBuilder::CSS::StyleSheetOrigin::Enum detectOrigin(CSSStyleSheet* pageStyleSheet, Document* ownerDocument);
191 bool styleSheetEditInProgress() const { return m_styleSheetsPendingMutation || m_styleDeclarationPendingMutation || m_isSettingStyleSheetText; }
193 PassRefPtr<TypeBuilder::CSS::CSSRule> buildObjectForRule(CSSStyleRule*);
194 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > buildArrayForRuleList(CSSRuleList*);
195 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::RuleMatch> > buildArrayForMatchedRuleList(CSSRuleList*, Element*);
196 PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForAttributesStyle(Element*);
197 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::Region> > buildArrayForRegions(ErrorString*, PassRefPtr<NodeList>, int documentNodeId);
198 PassRefPtr<TypeBuilder::CSS::NamedFlow> buildObjectForNamedFlow(ErrorString*, NamedFlow*, int documentNodeId);
200 // InspectorDOMAgent::DOMListener implementation
201 virtual void didRemoveDocument(Document*) OVERRIDE;
202 virtual void didRemoveDOMNode(Node*) OVERRIDE;
203 virtual void didModifyDOMAttr(Element*) OVERRIDE;
205 // InspectorStyleSheet::Listener implementation
206 virtual void styleSheetChanged(InspectorStyleSheet*) OVERRIDE;
207 virtual void willReparseStyleSheet() OVERRIDE;
208 virtual void didReparseStyleSheet() OVERRIDE;
210 void resetPseudoStates();
212 InspectorFrontend::CSS* m_frontend;
213 InspectorDOMAgent* m_domAgent;
214 InspectorPageAgent* m_pageAgent;
215 InspectorResourceAgent* m_resourceAgent;
217 IdToInspectorStyleSheet m_idToInspectorStyleSheet;
218 HashMap<CSSStyleSheet*, RefPtr<InspectorStyleSheet> > m_cssStyleSheetToInspectorStyleSheet;
219 HashMap<Frame*, OwnPtr<HashSet<CSSStyleSheet*> > > m_frameToCSSStyleSheets;
221 NodeToInspectorStyleSheet m_nodeToInspectorStyleSheet;
222 HashMap<RefPtr<Document>, RefPtr<InspectorStyleSheet> > m_documentToViaInspectorStyleSheet; // "via inspector" stylesheets
223 NodeIdToForcedPseudoState m_nodeIdToForcedPseudoState;
224 HashSet<int> m_namedFlowCollectionsRequested;
225 OwnPtr<UpdateRegionLayoutTask> m_updateRegionLayoutTask;
226 OwnPtr<ChangeRegionOversetTask> m_changeRegionOversetTask;
228 RefPtr<CSSStyleSheet> m_inspectorUserAgentStyleSheet;
230 int m_lastStyleSheetId;
231 int m_styleSheetsPendingMutation;
232 bool m_styleDeclarationPendingMutation;
233 bool m_creatingViaInspectorStyleSheet;
234 bool m_isSettingStyleSheetText;
236 friend class ChangeRegionOversetTask;
237 friend class EnableResourceClient;
238 friend class StyleSheetBinder;
239 friend class UpdateRegionLayoutTask;
243 } // namespace WebCore
245 #endif // !defined(InspectorCSSAgent_h)