5fcf5cd137d1fc31729dbf5e4034fe690ca253c5
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / inspector / InspectorCSSAgent.h
1 /*
2  * Copyright (C) 2010, Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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.
23  */
24
25 #ifndef InspectorCSSAgent_h
26 #define InspectorCSSAgent_h
27
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"
42
43 namespace WebCore {
44
45 class ChangeRegionOversetTask;
46 struct CSSParserString;
47 class CSSRule;
48 class CSSRuleList;
49 class CSSStyleRule;
50 class CSSStyleSheet;
51 class Document;
52 class Element;
53 class InspectorFrontend;
54 class InspectorResourceAgent;
55 class InstrumentingAgents;
56 class MediaList;
57 class Node;
58 class NodeList;
59 class PlatformFontUsage;
60 class RenderText;
61 class StyleResolver;
62 class UpdateRegionLayoutTask;
63
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);
70 public:
71     enum MediaListSource {
72         MediaListSourceLinkedSheet,
73         MediaListSourceInlineSheet,
74         MediaListSourceMediaRule,
75         MediaListSourceImportRule
76     };
77
78     enum StyleSheetsUpdateType {
79         InitialFrontendLoad = 0,
80         ExistingFrontendRefresh,
81     };
82
83     class InlineStyleOverrideScope {
84     public:
85         InlineStyleOverrideScope(SecurityContext* context)
86             : m_contentSecurityPolicy(context->contentSecurityPolicy())
87         {
88             m_contentSecurityPolicy->setOverrideAllowInlineStyle(true);
89         }
90
91         ~InlineStyleOverrideScope()
92         {
93             m_contentSecurityPolicy->setOverrideAllowInlineStyle(false);
94         }
95
96     private:
97         ContentSecurityPolicy* m_contentSecurityPolicy;
98     };
99
100     static CSSStyleRule* asCSSStyleRule(CSSRule*);
101
102     static PassOwnPtr<InspectorCSSAgent> create(InspectorDOMAgent* domAgent, InspectorPageAgent* pageAgent, InspectorResourceAgent* resourceAgent)
103     {
104         return adoptPtr(new InspectorCSSAgent(domAgent, pageAgent, resourceAgent));
105     }
106     virtual ~InspectorCSSAgent();
107
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;
115     void reset();
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);
124
125 private:
126     void regionLayoutUpdated(NamedFlow*, int documentNodeId);
127     void regionOversetChanged(NamedFlow*, int documentNodeId);
128
129 public:
130     void didUpdateRegionLayout(Document*, NamedFlow*);
131     void didChangeRegionOverset(Document*, NamedFlow*);
132
133     void activeStyleSheetsUpdated(Document*);
134     void frameDetachedFromParent(Frame*);
135
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;
152
153     PassRefPtr<TypeBuilder::CSS::CSSMedia> buildMediaObject(const MediaList*, MediaListSource, const String&, CSSStyleSheet*);
154     PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> > buildMediaListChain(CSSRule*);
155
156 private:
157     class StyleSheetAction;
158     class SetStyleSheetTextAction;
159     class SetStyleTextAction;
160     class SetPropertyTextAction;
161     class TogglePropertyAction;
162     class SetRuleSelectorAction;
163     class AddRuleAction;
164     class EnableResourceClient;
165
166     InspectorCSSAgent(InspectorDOMAgent*, InspectorPageAgent*, InspectorResourceAgent*);
167
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;
171
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*>&);
180
181     void updateActiveStyleSheetsForDocument(Document*, StyleSheetsUpdateType);
182     void updateActiveStyleSheets(Frame*, const Vector<CSSStyleSheet*>&, StyleSheetsUpdateType);
183
184     void collectPlatformFontsForRenderer(RenderText*, HashCountedSet<String>*);
185
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; }
192
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);
199
200     // InspectorDOMAgent::DOMListener implementation
201     virtual void didRemoveDocument(Document*) OVERRIDE;
202     virtual void didRemoveDOMNode(Node*) OVERRIDE;
203     virtual void didModifyDOMAttr(Element*) OVERRIDE;
204
205     // InspectorStyleSheet::Listener implementation
206     virtual void styleSheetChanged(InspectorStyleSheet*) OVERRIDE;
207     virtual void willReparseStyleSheet() OVERRIDE;
208     virtual void didReparseStyleSheet() OVERRIDE;
209
210     void resetPseudoStates();
211
212     InspectorFrontend::CSS* m_frontend;
213     InspectorDOMAgent* m_domAgent;
214     InspectorPageAgent* m_pageAgent;
215     InspectorResourceAgent* m_resourceAgent;
216
217     IdToInspectorStyleSheet m_idToInspectorStyleSheet;
218     HashMap<CSSStyleSheet*, RefPtr<InspectorStyleSheet> > m_cssStyleSheetToInspectorStyleSheet;
219     HashMap<Frame*, OwnPtr<HashSet<CSSStyleSheet*> > > m_frameToCSSStyleSheets;
220
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;
227
228     RefPtr<CSSStyleSheet> m_inspectorUserAgentStyleSheet;
229
230     int m_lastStyleSheetId;
231     int m_styleSheetsPendingMutation;
232     bool m_styleDeclarationPendingMutation;
233     bool m_creatingViaInspectorStyleSheet;
234     bool m_isSettingStyleSheetText;
235
236     friend class ChangeRegionOversetTask;
237     friend class EnableResourceClient;
238     friend class StyleSheetBinder;
239     friend class UpdateRegionLayoutTask;
240 };
241
242
243 } // namespace WebCore
244
245 #endif // !defined(InspectorCSSAgent_h)