fe1a3b10940267d5c66f71aeb32197403646a2b1
[WebKit-https.git] / Source / WebCore / 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 "CSSSelector.h"
29 #include "ContentSecurityPolicy.h"
30 #include "InspectorBaseAgent.h"
31 #include "InspectorDOMAgent.h"
32 #include "InspectorStyleSheet.h"
33 #include "InspectorValues.h"
34 #include "PlatformString.h"
35 #include "SecurityContext.h"
36
37 #include <wtf/HashMap.h>
38 #include <wtf/HashSet.h>
39 #include <wtf/PassRefPtr.h>
40 #include <wtf/RefPtr.h>
41
42 namespace WebCore {
43
44 class CSSRule;
45 class CSSRuleList;
46 class CSSStyleDeclaration;
47 class CSSStyleRule;
48 class CSSStyleSheet;
49 class Document;
50 class Element;
51 class InspectorFrontend;
52 class InstrumentingAgents;
53 class NameNodeMap;
54 class Node;
55 class NodeList;
56 class SelectorProfile;
57 class StyleResolver;
58
59 #if ENABLE(INSPECTOR)
60
61 class InspectorCSSAgent
62     : public InspectorBaseAgent<InspectorCSSAgent>
63     , public InspectorDOMAgent::DOMListener
64     , public InspectorBackendDispatcher::CSSCommandHandler
65     , public InspectorStyleSheet::Listener {
66     WTF_MAKE_NONCOPYABLE(InspectorCSSAgent);
67 public:
68     class InlineStyleOverrideScope {
69     public:
70         InlineStyleOverrideScope(SecurityContext* context)
71             : m_contentSecurityPolicy(context->contentSecurityPolicy())
72         {
73             m_contentSecurityPolicy->setOverrideAllowInlineStyle(true);
74         }
75
76         ~InlineStyleOverrideScope()
77         {
78             m_contentSecurityPolicy->setOverrideAllowInlineStyle(false);
79         }
80
81     private:
82         ContentSecurityPolicy* m_contentSecurityPolicy;
83     };
84
85     static CSSStyleRule* asCSSStyleRule(CSSRule*);
86
87     static PassOwnPtr<InspectorCSSAgent> create(InstrumentingAgents* instrumentingAgents, InspectorState* state, InspectorDOMAgent* domAgent)
88     {
89         return adoptPtr(new InspectorCSSAgent(instrumentingAgents, state, domAgent));
90     }
91     ~InspectorCSSAgent();
92
93     bool forcePseudoState(Element*, CSSSelector::PseudoType);
94     virtual void setFrontend(InspectorFrontend*);
95     virtual void clearFrontend();
96     virtual void discardAgent();
97     virtual void restore();
98     virtual void enable(ErrorString*);
99     virtual void disable(ErrorString*);
100     void reset();
101     void mediaQueryResultChanged();
102     void didCreateNamedFlow(Document*, const AtomicString& name);
103     void didRemoveNamedFlow(Document*, const AtomicString& name);
104
105     virtual void getComputedStyleForNode(ErrorString*, int nodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> >&);
106     virtual void getInlineStylesForNode(ErrorString*, int nodeId, RefPtr<TypeBuilder::CSS::CSSStyle>& inlineStyle, RefPtr<TypeBuilder::CSS::CSSStyle>& attributes);
107     virtual void getMatchedStylesForNode(ErrorString*, int nodeId, const bool* includePseudo, const bool* includeInherited, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> >& matchedCSSRules, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PseudoIdRules> >& pseudoRules, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::InheritedStyleEntry> >& inheritedEntries);
108     virtual void getAllStyleSheets(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader> >& styleSheetInfos);
109     virtual void getStyleSheet(ErrorString*, const String& styleSheetId, RefPtr<TypeBuilder::CSS::CSSStyleSheetBody>& result);
110     virtual void getStyleSheetText(ErrorString*, const String& styleSheetId, String* result);
111     virtual void setStyleSheetText(ErrorString*, const String& styleSheetId, const String& text);
112     virtual void setPropertyText(ErrorString*, const RefPtr<InspectorObject>& styleId, int propertyIndex, const String& text, bool overwrite, RefPtr<TypeBuilder::CSS::CSSStyle>& result);
113     virtual void toggleProperty(ErrorString*, const RefPtr<InspectorObject>& styleId, int propertyIndex, bool disable, RefPtr<TypeBuilder::CSS::CSSStyle>& result);
114     virtual void setRuleSelector(ErrorString*, const RefPtr<InspectorObject>& ruleId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result);
115     virtual void addRule(ErrorString*, int contextNodeId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result);
116     virtual void getSupportedCSSProperties(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSPropertyInfo> >& result);
117     virtual void forcePseudoState(ErrorString*, int nodeId, const RefPtr<InspectorArray>& forcedPseudoClasses);
118     virtual void getNamedFlowCollection(ErrorString*, int documentNodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::NamedFlow> >& result);
119     virtual void getFlowByName(ErrorString*, int documentNodeId, const String& flowName, RefPtr<TypeBuilder::CSS::NamedFlow>& result);
120
121     virtual void startSelectorProfiler(ErrorString*);
122     virtual void stopSelectorProfiler(ErrorString*, RefPtr<TypeBuilder::CSS::SelectorProfile>&);
123
124     PassRefPtr<TypeBuilder::CSS::SelectorProfile> stopSelectorProfilerImpl(ErrorString*, bool needProfile);
125     void willMatchRule(const CSSStyleRule*);
126     void didMatchRule(bool);
127     void willProcessRule(const CSSStyleRule*);
128     void didProcessRule();
129
130 private:
131     class StyleSheetAction;
132     class SetStyleSheetTextAction;
133     class SetPropertyTextAction;
134     class TogglePropertyAction;
135     class SetRuleSelectorAction;
136     class AddRuleAction;
137
138     InspectorCSSAgent(InstrumentingAgents*, InspectorState*, InspectorDOMAgent*);
139
140     typedef HashMap<String, RefPtr<InspectorStyleSheet> > IdToInspectorStyleSheet;
141     typedef HashMap<CSSStyleSheet*, RefPtr<InspectorStyleSheet> > CSSStyleSheetToInspectorStyleSheet;
142     typedef HashMap<Node*, RefPtr<InspectorStyleSheetForInlineStyle> > NodeToInspectorStyleSheet; // bogus "stylesheets" with elements' inline styles
143     typedef HashMap<RefPtr<Document>, RefPtr<InspectorStyleSheet> > DocumentToViaInspectorStyleSheet; // "via inspector" stylesheets
144     typedef HashMap<int, unsigned> NodeIdToForcedPseudoState;
145
146     InspectorStyleSheetForInlineStyle* asInspectorStyleSheet(Element* element);
147     Element* elementForId(ErrorString*, int nodeId);
148     void collectStyleSheets(CSSStyleSheet*, TypeBuilder::Array<WebCore::TypeBuilder::CSS::CSSStyleSheetHeader>*);
149
150     InspectorStyleSheet* bindStyleSheet(CSSStyleSheet*);
151     InspectorStyleSheet* viaInspectorStyleSheet(Document*, bool createIfAbsent);
152     InspectorStyleSheet* assertStyleSheetForId(ErrorString*, const String&);
153     TypeBuilder::CSS::StyleSheetOrigin::Enum detectOrigin(CSSStyleSheet* pageStyleSheet, Document* ownerDocument);
154
155     PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > buildArrayForRuleList(CSSRuleList*, StyleResolver*);
156     PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForAttributesStyle(Element*);
157     PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::Region> > buildArrayForRegions(ErrorString*, PassRefPtr<NodeList>, int documentNodeId);
158     PassRefPtr<TypeBuilder::CSS::NamedFlow> buildObjectForNamedFlow(ErrorString*, WebKitNamedFlow*, int documentNodeId);
159
160     // InspectorDOMAgent::DOMListener implementation
161     virtual void didRemoveDocument(Document*);
162     virtual void didRemoveDOMNode(Node*);
163     virtual void didModifyDOMAttr(Element*);
164
165     // InspectorCSSAgent::Listener implementation
166     virtual void styleSheetChanged(InspectorStyleSheet*);
167
168     void resetPseudoStates();
169
170     InspectorFrontend::CSS* m_frontend;
171     InspectorDOMAgent* m_domAgent;
172
173     IdToInspectorStyleSheet m_idToInspectorStyleSheet;
174     CSSStyleSheetToInspectorStyleSheet m_cssStyleSheetToInspectorStyleSheet;
175     NodeToInspectorStyleSheet m_nodeToInspectorStyleSheet;
176     DocumentToViaInspectorStyleSheet m_documentToInspectorStyleSheet;
177     NodeIdToForcedPseudoState m_nodeIdToForcedPseudoState;
178     HashSet<int> m_namedFlowCollectionsRequested;
179
180     int m_lastStyleSheetId;
181
182     OwnPtr<SelectorProfile> m_currentSelectorProfile;
183 };
184
185 #endif
186
187 } // namespace WebCore
188
189 #endif // !defined(InspectorCSSAgent_h)