#include "core/css/CSSSelector.h"
#include "core/dom/SecurityContext.h"
+#include "core/frame/csp/ContentSecurityPolicy.h"
#include "core/inspector/InspectorBaseAgent.h"
#include "core/inspector/InspectorDOMAgent.h"
#include "core/inspector/InspectorStyleSheet.h"
-#include "core/frame/ContentSecurityPolicy.h"
#include "platform/JSONValues.h"
+#include "wtf/HashCountedSet.h"
#include "wtf/HashMap.h"
#include "wtf/HashSet.h"
#include "wtf/PassRefPtr.h"
namespace WebCore {
-class ChangeRegionOversetTask;
struct CSSParserString;
class CSSRule;
class CSSRuleList;
class Node;
class NodeList;
class PlatformFontUsage;
+class RenderText;
class StyleResolver;
-class UpdateRegionLayoutTask;
-typedef HashMap<CSSStyleSheet*, RefPtr<InspectorStyleSheet> > CSSStyleSheetToInspectorStyleSheet;
-typedef Vector<RefPtr<StyleSheet> > StyleSheetVector;
-
-class InspectorCSSAgent
+class InspectorCSSAgent FINAL
: public InspectorBaseAgent<InspectorCSSAgent>
, public InspectorDOMAgent::DOMListener
, public InspectorBackendDispatcher::CSSCommandHandler
- , public InspectorStyleSheet::Listener {
+ , public InspectorStyleSheetBase::Listener {
WTF_MAKE_NONCOPYABLE(InspectorCSSAgent);
public:
enum MediaListSource {
MediaListSourceImportRule
};
+ enum StyleSheetsUpdateType {
+ InitialFrontendLoad = 0,
+ ExistingFrontendRefresh,
+ };
+
class InlineStyleOverrideScope {
public:
InlineStyleOverrideScope(SecurityContext* context)
static CSSStyleRule* asCSSStyleRule(CSSRule*);
- static PassOwnPtr<InspectorCSSAgent> create(InstrumentingAgents* instrumentingAgents, InspectorCompositeState* state, InspectorDOMAgent* domAgent, InspectorPageAgent* pageAgent, InspectorResourceAgent* resourceAgent)
+ static PassOwnPtr<InspectorCSSAgent> create(InspectorDOMAgent* domAgent, InspectorPageAgent* pageAgent, InspectorResourceAgent* resourceAgent)
{
- return adoptPtr(new InspectorCSSAgent(instrumentingAgents, state, domAgent, pageAgent, resourceAgent));
+ return adoptPtr(new InspectorCSSAgent(domAgent, pageAgent, resourceAgent));
}
- ~InspectorCSSAgent();
+ virtual ~InspectorCSSAgent();
bool forcePseudoState(Element*, CSSSelector::PseudoType);
- virtual void setFrontend(InspectorFrontend*);
- virtual void clearFrontend();
- virtual void discardAgent();
- virtual void restore();
- virtual void enable(ErrorString*, PassRefPtr<EnableCallback>);
- virtual void disable(ErrorString*);
+ virtual void setFrontend(InspectorFrontend*) OVERRIDE;
+ virtual void clearFrontend() OVERRIDE;
+ virtual void discardAgent() OVERRIDE;
+ virtual void didCommitLoadForMainFrame() OVERRIDE;
+ virtual void restore() OVERRIDE;
+ virtual void flushPendingFrontendMessages() OVERRIDE;
+ virtual void enable(ErrorString*, PassRefPtr<EnableCallback>) OVERRIDE;
+ virtual void disable(ErrorString*) OVERRIDE;
void reset();
- void didCommitLoad(Frame*, DocumentLoader*);
void mediaQueryResultChanged();
- void didCreateNamedFlow(Document*, NamedFlow*);
- void willRemoveNamedFlow(Document*, NamedFlow*);
-
-private:
- void regionLayoutUpdated(NamedFlow*, int documentNodeId);
- void regionOversetChanged(NamedFlow*, int documentNodeId);
-
-public:
- void didUpdateRegionLayout(Document*, NamedFlow*);
- void didChangeRegionOverset(Document*, NamedFlow*);
-
- void activeStyleSheetsUpdated(Document*, const StyleSheetVector& newSheets);
- void frameDetachedFromParent(Frame*);
-
- virtual void getComputedStyleForNode(ErrorString*, int nodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> >&);
- virtual void getPlatformFontsForNode(ErrorString*, int nodeId, String* cssFamilyName, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PlatformFontUsage> >&);
- virtual void getInlineStylesForNode(ErrorString*, int nodeId, RefPtr<TypeBuilder::CSS::CSSStyle>& inlineStyle, RefPtr<TypeBuilder::CSS::CSSStyle>& attributes);
- 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);
- virtual void getAllStyleSheets(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader> >& styleSheetInfos);
- virtual void getStyleSheet(ErrorString*, const String& styleSheetId, RefPtr<TypeBuilder::CSS::CSSStyleSheetBody>& result);
- virtual void getStyleSheetText(ErrorString*, const String& styleSheetId, String* result);
- virtual void setStyleSheetText(ErrorString*, const String& styleSheetId, const String& text);
- virtual void setStyleText(ErrorString*, const RefPtr<JSONObject>& styleId, const String& text, RefPtr<TypeBuilder::CSS::CSSStyle>& result);
- virtual void setPropertyText(ErrorString*, const RefPtr<JSONObject>& styleId, int propertyIndex, const String& text, bool overwrite, RefPtr<TypeBuilder::CSS::CSSStyle>& result);
- virtual void toggleProperty(ErrorString*, const RefPtr<JSONObject>& styleId, int propertyIndex, bool disable, RefPtr<TypeBuilder::CSS::CSSStyle>& result);
- virtual void setRuleSelector(ErrorString*, const RefPtr<JSONObject>& ruleId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result);
- virtual void addRule(ErrorString*, int contextNodeId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result);
- virtual void getSupportedCSSProperties(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSPropertyInfo> >& result);
- virtual void forcePseudoState(ErrorString*, int nodeId, const RefPtr<JSONArray>& forcedPseudoClasses);
- virtual void getNamedFlowCollection(ErrorString*, int documentNodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::NamedFlow> >& result);
+ void willMutateRules();
+ void didMutateRules(CSSStyleSheet*);
+ void willMutateStyle();
+ void didMutateStyle(CSSStyleDeclaration*, bool);
+
+ void activeStyleSheetsUpdated(Document*);
+ void documentDetached(Document*);
+
+ virtual void getComputedStyleForNode(ErrorString*, int nodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> >&) OVERRIDE;
+ virtual void getPlatformFontsForNode(ErrorString*, int nodeId, String* cssFamilyName, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PlatformFontUsage> >&) OVERRIDE;
+ virtual void getInlineStylesForNode(ErrorString*, int nodeId, RefPtr<TypeBuilder::CSS::CSSStyle>& inlineStyle, RefPtr<TypeBuilder::CSS::CSSStyle>& attributes) OVERRIDE;
+ 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;
+ virtual void getStyleSheetText(ErrorString*, const String& styleSheetId, String* result) OVERRIDE;
+ virtual void setStyleSheetText(ErrorString*, const String& styleSheetId, const String& text) OVERRIDE;
+
+ virtual void setPropertyText(ErrorString*, const String& styleSheetId, const RefPtr<JSONObject>& range, const String& text, RefPtr<TypeBuilder::CSS::CSSStyle>& result) OVERRIDE;
+ virtual void setRuleSelector(ErrorString*, const String& styleSheetId, const RefPtr<JSONObject>& range, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result) OVERRIDE;
+ virtual void createStyleSheet(ErrorString*, const String& frameId, TypeBuilder::CSS::StyleSheetId* outStyleSheetId) OVERRIDE;
+ virtual void addRule(ErrorString*, const String& styleSheetId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result) OVERRIDE;
+ virtual void forcePseudoState(ErrorString*, int nodeId, const RefPtr<JSONArray>& forcedPseudoClasses) OVERRIDE;
PassRefPtr<TypeBuilder::CSS::CSSMedia> buildMediaObject(const MediaList*, MediaListSource, const String&, CSSStyleSheet*);
PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> > buildMediaListChain(CSSRule*);
private:
class StyleSheetAction;
class SetStyleSheetTextAction;
- class SetStyleTextAction;
class SetPropertyTextAction;
- class TogglePropertyAction;
class SetRuleSelectorAction;
class AddRuleAction;
class EnableResourceClient;
- InspectorCSSAgent(InstrumentingAgents*, InspectorCompositeState*, InspectorDOMAgent*, InspectorPageAgent*, InspectorResourceAgent*);
+ InspectorCSSAgent(InspectorDOMAgent*, InspectorPageAgent*, InspectorResourceAgent*);
typedef HashMap<String, RefPtr<InspectorStyleSheet> > IdToInspectorStyleSheet;
+ typedef HashMap<String, RefPtr<InspectorStyleSheetForInlineStyle> > IdToInspectorStyleSheetForInlineStyle;
typedef HashMap<Node*, RefPtr<InspectorStyleSheetForInlineStyle> > NodeToInspectorStyleSheet; // bogus "stylesheets" with elements' inline styles
- typedef HashMap<RefPtr<Document>, RefPtr<InspectorStyleSheet> > DocumentToViaInspectorStyleSheet; // "via inspector" stylesheets
typedef HashMap<int, unsigned> NodeIdToForcedPseudoState;
void wasEnabled(PassRefPtr<EnableCallback>);
void resetNonPersistentData();
InspectorStyleSheetForInlineStyle* asInspectorStyleSheet(Element* element);
Element* elementForId(ErrorString*, int nodeId);
- int documentNodeWithRequestedFlowsId(Document*);
void collectAllStyleSheets(Vector<InspectorStyleSheet*>&);
- void collectStyleSheets(CSSStyleSheet*, Vector<InspectorStyleSheet*>&);
+ void collectAllDocumentStyleSheets(Document*, Vector<CSSStyleSheet*>&);
+ void collectStyleSheets(CSSStyleSheet*, Vector<CSSStyleSheet*>&);
+
+ void updateActiveStyleSheets(Document*, StyleSheetsUpdateType);
+ void setActiveStyleSheets(Document*, const Vector<CSSStyleSheet*>&, StyleSheetsUpdateType);
- void collectPlatformFontsForRenderer(RenderText*, HashMap<String, int>*);
+ void collectPlatformFontsForRenderer(RenderText*, HashCountedSet<String>*);
InspectorStyleSheet* bindStyleSheet(CSSStyleSheet*);
String unbindStyleSheet(InspectorStyleSheet*);
InspectorStyleSheet* viaInspectorStyleSheet(Document*, bool createIfAbsent);
- InspectorStyleSheet* assertStyleSheetForId(ErrorString*, const String&);
+ InspectorStyleSheet* assertInspectorStyleSheetForId(ErrorString*, const String&);
+ InspectorStyleSheetBase* assertStyleSheetForId(ErrorString*, const String&);
TypeBuilder::CSS::StyleSheetOrigin::Enum detectOrigin(CSSStyleSheet* pageStyleSheet, Document* ownerDocument);
+ bool styleSheetEditInProgress() const { return m_styleSheetsPendingMutation || m_styleDeclarationPendingMutation || m_isSettingStyleSheetText; }
- PassRefPtr<TypeBuilder::CSS::CSSRule> buildObjectForRule(CSSStyleRule*, StyleResolver*);
- PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > buildArrayForRuleList(CSSRuleList*, StyleResolver*);
- PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::RuleMatch> > buildArrayForMatchedRuleList(CSSRuleList*, StyleResolver*, Element*);
+ PassRefPtr<TypeBuilder::CSS::CSSRule> buildObjectForRule(CSSStyleRule*);
+ PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::RuleMatch> > buildArrayForMatchedRuleList(CSSRuleList*, Element*);
PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForAttributesStyle(Element*);
- PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::Region> > buildArrayForRegions(ErrorString*, PassRefPtr<NodeList>, int documentNodeId);
- PassRefPtr<TypeBuilder::CSS::NamedFlow> buildObjectForNamedFlow(ErrorString*, NamedFlow*, int documentNodeId);
// InspectorDOMAgent::DOMListener implementation
- virtual void didRemoveDocument(Document*);
- virtual void didRemoveDOMNode(Node*);
- virtual void didModifyDOMAttr(Element*);
+ virtual void didRemoveDocument(Document*) OVERRIDE;
+ virtual void didRemoveDOMNode(Node*) OVERRIDE;
+ virtual void didModifyDOMAttr(Element*) OVERRIDE;
- // InspectorCSSAgent::Listener implementation
- virtual void styleSheetChanged(InspectorStyleSheet*) OVERRIDE;
+ // InspectorStyleSheet::Listener implementation
+ virtual void styleSheetChanged(InspectorStyleSheetBase*) OVERRIDE;
virtual void willReparseStyleSheet() OVERRIDE;
virtual void didReparseStyleSheet() OVERRIDE;
InspectorResourceAgent* m_resourceAgent;
IdToInspectorStyleSheet m_idToInspectorStyleSheet;
- CSSStyleSheetToInspectorStyleSheet m_cssStyleSheetToInspectorStyleSheet;
+ IdToInspectorStyleSheetForInlineStyle m_idToInspectorStyleSheetForInlineStyle;
+ HashMap<CSSStyleSheet*, RefPtr<InspectorStyleSheet> > m_cssStyleSheetToInspectorStyleSheet;
+ typedef HashMap<Document*, OwnPtr<HashSet<CSSStyleSheet*> > > DocumentStyleSheets;
+ DocumentStyleSheets m_documentToCSSStyleSheets;
+ HashSet<Document*> m_invalidatedDocuments;
+
NodeToInspectorStyleSheet m_nodeToInspectorStyleSheet;
- DocumentToViaInspectorStyleSheet m_documentToInspectorStyleSheet;
+ HashMap<RefPtr<Document>, RefPtr<InspectorStyleSheet> > m_documentToViaInspectorStyleSheet; // "via inspector" stylesheets
NodeIdToForcedPseudoState m_nodeIdToForcedPseudoState;
- HashSet<int> m_namedFlowCollectionsRequested;
- OwnPtr<UpdateRegionLayoutTask> m_updateRegionLayoutTask;
- OwnPtr<ChangeRegionOversetTask> m_changeRegionOversetTask;
+
+ RefPtrWillBePersistent<CSSStyleSheet> m_inspectorUserAgentStyleSheet;
int m_lastStyleSheetId;
+ int m_styleSheetsPendingMutation;
+ bool m_styleDeclarationPendingMutation;
bool m_creatingViaInspectorStyleSheet;
bool m_isSettingStyleSheetText;
- friend class ChangeRegionOversetTask;
friend class EnableResourceClient;
friend class StyleSheetBinder;
- friend class UpdateRegionLayoutTask;
};