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/inspector/InspectorBaseAgent.h" 31 #include "core/inspector/InspectorDOMAgent.h" 32 #include "core/inspector/InspectorStyleSheet.h" 33 #include "core/frame/ContentSecurityPolicy.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 typedef HashMap<CSSStyleSheet*, RefPtr<InspectorStyleSheet> > CSSStyleSheetToInspectorStyleSheet; 65 typedef Vector<RefPtr<StyleSheet> > StyleSheetVector; 66 67 class InspectorCSSAgent 68 : public InspectorBaseAgent<InspectorCSSAgent> 69 , public InspectorDOMAgent::DOMListener 70 , public InspectorBackendDispatcher::CSSCommandHandler 71 , public InspectorStyleSheet::Listener { 72 WTF_MAKE_NONCOPYABLE(InspectorCSSAgent); 73 public: 74 enum MediaListSource { 75 MediaListSourceLinkedSheet, 76 MediaListSourceInlineSheet, 77 MediaListSourceMediaRule, 78 MediaListSourceImportRule 79 }; 80 81 class InlineStyleOverrideScope { 82 public: InlineStyleOverrideScope(SecurityContext * context)83 InlineStyleOverrideScope(SecurityContext* context) 84 : m_contentSecurityPolicy(context->contentSecurityPolicy()) 85 { 86 m_contentSecurityPolicy->setOverrideAllowInlineStyle(true); 87 } 88 ~InlineStyleOverrideScope()89 ~InlineStyleOverrideScope() 90 { 91 m_contentSecurityPolicy->setOverrideAllowInlineStyle(false); 92 } 93 94 private: 95 ContentSecurityPolicy* m_contentSecurityPolicy; 96 }; 97 98 static CSSStyleRule* asCSSStyleRule(CSSRule*); 99 create(InstrumentingAgents * instrumentingAgents,InspectorCompositeState * state,InspectorDOMAgent * domAgent,InspectorPageAgent * pageAgent,InspectorResourceAgent * resourceAgent)100 static PassOwnPtr<InspectorCSSAgent> create(InstrumentingAgents* instrumentingAgents, InspectorCompositeState* state, InspectorDOMAgent* domAgent, InspectorPageAgent* pageAgent, InspectorResourceAgent* resourceAgent) 101 { 102 return adoptPtr(new InspectorCSSAgent(instrumentingAgents, state, domAgent, pageAgent, resourceAgent)); 103 } 104 ~InspectorCSSAgent(); 105 106 bool forcePseudoState(Element*, CSSSelector::PseudoType); 107 virtual void setFrontend(InspectorFrontend*); 108 virtual void clearFrontend(); 109 virtual void discardAgent(); 110 virtual void restore(); 111 virtual void enable(ErrorString*, PassRefPtr<EnableCallback>); 112 virtual void disable(ErrorString*); 113 void reset(); 114 void didCommitLoad(Frame*, DocumentLoader*); 115 void mediaQueryResultChanged(); 116 void didCreateNamedFlow(Document*, NamedFlow*); 117 void willRemoveNamedFlow(Document*, NamedFlow*); 118 void willMutateRules(); 119 void didMutateRules(CSSStyleSheet*); 120 void willMutateStyle(); 121 void didMutateStyle(CSSStyleDeclaration*, bool); 122 123 private: 124 void regionLayoutUpdated(NamedFlow*, int documentNodeId); 125 void regionOversetChanged(NamedFlow*, int documentNodeId); 126 127 public: 128 void didUpdateRegionLayout(Document*, NamedFlow*); 129 void didChangeRegionOverset(Document*, NamedFlow*); 130 131 void activeStyleSheetsUpdated(Document*, const StyleSheetVector& newSheets); 132 void frameDetachedFromParent(Frame*); 133 134 virtual void getComputedStyleForNode(ErrorString*, int nodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> >&); 135 virtual void getPlatformFontsForNode(ErrorString*, int nodeId, String* cssFamilyName, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PlatformFontUsage> >&); 136 virtual void getInlineStylesForNode(ErrorString*, int nodeId, RefPtr<TypeBuilder::CSS::CSSStyle>& inlineStyle, RefPtr<TypeBuilder::CSS::CSSStyle>& attributes); 137 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> >& pseudoIdMatches, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::InheritedStyleEntry> >& inheritedEntries); 138 virtual void getAllStyleSheets(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader> >& styleSheetInfos); 139 virtual void getStyleSheet(ErrorString*, const String& styleSheetId, RefPtr<TypeBuilder::CSS::CSSStyleSheetBody>& result); 140 virtual void getStyleSheetText(ErrorString*, const String& styleSheetId, String* result); 141 virtual void setStyleSheetText(ErrorString*, const String& styleSheetId, const String& text); 142 virtual void setStyleText(ErrorString*, const RefPtr<JSONObject>& styleId, const String& text, RefPtr<TypeBuilder::CSS::CSSStyle>& result); 143 virtual void setPropertyText(ErrorString*, const RefPtr<JSONObject>& styleId, int propertyIndex, const String& text, bool overwrite, RefPtr<TypeBuilder::CSS::CSSStyle>& result); 144 virtual void toggleProperty(ErrorString*, const RefPtr<JSONObject>& styleId, int propertyIndex, bool disable, RefPtr<TypeBuilder::CSS::CSSStyle>& result); 145 virtual void setRuleSelector(ErrorString*, const RefPtr<JSONObject>& ruleId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result); 146 virtual void addRule(ErrorString*, int contextNodeId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result); 147 virtual void getSupportedCSSProperties(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSPropertyInfo> >& result); 148 virtual void forcePseudoState(ErrorString*, int nodeId, const RefPtr<JSONArray>& forcedPseudoClasses); 149 virtual void getNamedFlowCollection(ErrorString*, int documentNodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::NamedFlow> >& result); 150 151 PassRefPtr<TypeBuilder::CSS::CSSMedia> buildMediaObject(const MediaList*, MediaListSource, const String&, CSSStyleSheet*); 152 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> > buildMediaListChain(CSSRule*); 153 154 private: 155 class StyleSheetAction; 156 class SetStyleSheetTextAction; 157 class SetStyleTextAction; 158 class SetPropertyTextAction; 159 class TogglePropertyAction; 160 class SetRuleSelectorAction; 161 class AddRuleAction; 162 class EnableResourceClient; 163 164 InspectorCSSAgent(InstrumentingAgents*, InspectorCompositeState*, InspectorDOMAgent*, InspectorPageAgent*, InspectorResourceAgent*); 165 166 typedef HashMap<String, RefPtr<InspectorStyleSheet> > IdToInspectorStyleSheet; 167 typedef HashMap<Node*, RefPtr<InspectorStyleSheetForInlineStyle> > NodeToInspectorStyleSheet; // bogus "stylesheets" with elements' inline styles 168 typedef HashMap<RefPtr<Document>, RefPtr<InspectorStyleSheet> > DocumentToViaInspectorStyleSheet; // "via inspector" stylesheets 169 typedef HashMap<int, unsigned> NodeIdToForcedPseudoState; 170 171 void wasEnabled(PassRefPtr<EnableCallback>); 172 void resetNonPersistentData(); 173 InspectorStyleSheetForInlineStyle* asInspectorStyleSheet(Element* element); 174 Element* elementForId(ErrorString*, int nodeId); 175 int documentNodeWithRequestedFlowsId(Document*); 176 void collectAllStyleSheets(Vector<InspectorStyleSheet*>&); 177 void collectStyleSheets(CSSStyleSheet*, Vector<InspectorStyleSheet*>&); 178 179 void collectPlatformFontsForRenderer(RenderText*, HashCountedSet<String>*); 180 181 InspectorStyleSheet* bindStyleSheet(CSSStyleSheet*); 182 String unbindStyleSheet(InspectorStyleSheet*); 183 InspectorStyleSheet* viaInspectorStyleSheet(Document*, bool createIfAbsent); 184 InspectorStyleSheet* assertStyleSheetForId(ErrorString*, const String&); 185 TypeBuilder::CSS::StyleSheetOrigin::Enum detectOrigin(CSSStyleSheet* pageStyleSheet, Document* ownerDocument); styleSheetEditInProgress()186 bool styleSheetEditInProgress() const { return m_styleSheetsPendingMutation || m_styleDeclarationPendingMutation || m_isSettingStyleSheetText; } 187 188 PassRefPtr<TypeBuilder::CSS::CSSRule> buildObjectForRule(CSSStyleRule*, StyleResolver&); 189 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > buildArrayForRuleList(CSSRuleList*, StyleResolver&); 190 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::RuleMatch> > buildArrayForMatchedRuleList(CSSRuleList*, StyleResolver&, Element*); 191 PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForAttributesStyle(Element*); 192 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::Region> > buildArrayForRegions(ErrorString*, PassRefPtr<NodeList>, int documentNodeId); 193 PassRefPtr<TypeBuilder::CSS::NamedFlow> buildObjectForNamedFlow(ErrorString*, NamedFlow*, int documentNodeId); 194 195 // InspectorDOMAgent::DOMListener implementation 196 virtual void didRemoveDocument(Document*); 197 virtual void didRemoveDOMNode(Node*); 198 virtual void didModifyDOMAttr(Element*); 199 200 // InspectorStyleSheet::Listener implementation 201 virtual void styleSheetChanged(InspectorStyleSheet*) OVERRIDE; 202 virtual void willReparseStyleSheet() OVERRIDE; 203 virtual void didReparseStyleSheet() OVERRIDE; 204 205 void resetPseudoStates(); 206 207 InspectorFrontend::CSS* m_frontend; 208 InspectorDOMAgent* m_domAgent; 209 InspectorPageAgent* m_pageAgent; 210 InspectorResourceAgent* m_resourceAgent; 211 212 IdToInspectorStyleSheet m_idToInspectorStyleSheet; 213 CSSStyleSheetToInspectorStyleSheet m_cssStyleSheetToInspectorStyleSheet; 214 NodeToInspectorStyleSheet m_nodeToInspectorStyleSheet; 215 DocumentToViaInspectorStyleSheet m_documentToInspectorStyleSheet; 216 NodeIdToForcedPseudoState m_nodeIdToForcedPseudoState; 217 HashSet<int> m_namedFlowCollectionsRequested; 218 OwnPtr<UpdateRegionLayoutTask> m_updateRegionLayoutTask; 219 OwnPtr<ChangeRegionOversetTask> m_changeRegionOversetTask; 220 221 int m_lastStyleSheetId; 222 int m_styleSheetsPendingMutation; 223 bool m_styleDeclarationPendingMutation; 224 bool m_creatingViaInspectorStyleSheet; 225 bool m_isSettingStyleSheetText; 226 227 friend class ChangeRegionOversetTask; 228 friend class EnableResourceClient; 229 friend class StyleSheetBinder; 230 friend class UpdateRegionLayoutTask; 231 }; 232 233 234 } // namespace WebCore 235 236 #endif // !defined(InspectorCSSAgent_h) 237