Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(373)

Side by Side Diff: Source/core/inspector/InspectorCSSAgent.cpp

Issue 14320027: DevTools: Track CSSStyleSheetHeaders in the front-end real time (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Patch for trybots (with [Slow]) Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010, Google Inc. All rights reserved. 2 * Copyright (C) 2010, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 #include "NamedFlow.h" 47 #include "NamedFlow.h"
48 #include "NamedFlowCollection.h" 48 #include "NamedFlowCollection.h"
49 #include "Node.h" 49 #include "Node.h"
50 #include "NodeList.h" 50 #include "NodeList.h"
51 #include "RenderRegion.h" 51 #include "RenderRegion.h"
52 #include "SVGStyleElement.h" 52 #include "SVGStyleElement.h"
53 #include "StylePropertySet.h" 53 #include "StylePropertySet.h"
54 #include "StylePropertyShorthand.h" 54 #include "StylePropertyShorthand.h"
55 #include "StyleResolver.h" 55 #include "StyleResolver.h"
56 #include "StyleRule.h" 56 #include "StyleRule.h"
57 #include "StyleSheet.h"
57 #include "StyleSheetList.h" 58 #include "StyleSheetList.h"
58 59
59 #include <wtf/CurrentTime.h> 60 #include <wtf/CurrentTime.h>
60 #include <wtf/HashSet.h> 61 #include <wtf/HashSet.h>
61 #include <wtf/Vector.h> 62 #include <wtf/Vector.h>
62 #include <wtf/text/CString.h> 63 #include <wtf/text/CString.h>
63 #include <wtf/text/StringConcatenate.h> 64 #include <wtf/text/StringConcatenate.h>
64 65
65 namespace CSSAgentState { 66 namespace CSSAgentState {
66 static const char cssAgentEnabled[] = "cssAgentEnabled"; 67 static const char cssAgentEnabled[] = "cssAgentEnabled";
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 private: 125 private:
125 126
126 // Key is "selector?url:line". 127 // Key is "selector?url:line".
127 typedef HashMap<String, RuleMatchingStats> RuleMatchingStatsMap; 128 typedef HashMap<String, RuleMatchingStats> RuleMatchingStatsMap;
128 129
129 double m_totalMatchingTimeMs; 130 double m_totalMatchingTimeMs;
130 RuleMatchingStatsMap m_ruleMatchingStats; 131 RuleMatchingStatsMap m_ruleMatchingStats;
131 RuleMatchData m_currentMatchData; 132 RuleMatchData m_currentMatchData;
132 }; 133 };
133 134
135 class StyleSheetVisitor {
136 public:
137 StyleSheetVisitor(CSSStyleSheet* styleSheet)
138 : m_styleSheet(styleSheet) { }
139 virtual ~StyleSheetVisitor() { }
140 void run();
141 virtual void visit(CSSStyleSheet*) = 0;
142
143 private:
144 void run(CSSStyleSheet*);
145 CSSStyleSheet* m_styleSheet;
146 };
147
148 void StyleSheetVisitor::run()
149 {
150 run(m_styleSheet);
151 }
152
153 void StyleSheetVisitor::run(CSSStyleSheet* styleSheet)
154 {
155 visit(styleSheet);
156 for (unsigned i = 0, size = styleSheet->length(); i < size; ++i) {
157 CSSRule* rule = styleSheet->item(i);
158 if (rule->type() == CSSRule::IMPORT_RULE) {
159 CSSStyleSheet* importedStyleSheet = static_cast<CSSImportRule*>(rule )->styleSheet();
160 if (importedStyleSheet)
161 run(importedStyleSheet);
162 }
163 }
164 }
165
166 class StyleSheetAppender : public StyleSheetVisitor {
167 public:
168 StyleSheetAppender(CSSStyleSheet* styleSheet, Vector<CSSStyleSheet*>& result )
169 : StyleSheetVisitor(styleSheet)
170 , m_result(result) { }
171
172 private:
173 virtual void visit(CSSStyleSheet* styleSheet) OVERRIDE
174 {
175 m_result.append(styleSheet);
176 }
177
178 Vector<CSSStyleSheet*>& m_result;
179 };
134 180
135 static unsigned computePseudoClassMask(InspectorArray* pseudoClassArray) 181 static unsigned computePseudoClassMask(InspectorArray* pseudoClassArray)
136 { 182 {
137 DEFINE_STATIC_LOCAL(String, active, (ASCIILiteral("active"))); 183 DEFINE_STATIC_LOCAL(String, active, (ASCIILiteral("active")));
138 DEFINE_STATIC_LOCAL(String, hover, (ASCIILiteral("hover"))); 184 DEFINE_STATIC_LOCAL(String, hover, (ASCIILiteral("hover")));
139 DEFINE_STATIC_LOCAL(String, focus, (ASCIILiteral("focus"))); 185 DEFINE_STATIC_LOCAL(String, focus, (ASCIILiteral("focus")));
140 DEFINE_STATIC_LOCAL(String, visited, (ASCIILiteral("visited"))); 186 DEFINE_STATIC_LOCAL(String, visited, (ASCIILiteral("visited")));
141 if (!pseudoClassArray || !pseudoClassArray->length()) 187 if (!pseudoClassArray || !pseudoClassArray->length())
142 return PseudoNone; 188 return PseudoNone;
143 189
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 if (rule->type() != CSSRule::STYLE_RULE) 617 if (rule->type() != CSSRule::STYLE_RULE)
572 return 0; 618 return 0;
573 return static_cast<CSSStyleRule*>(rule); 619 return static_cast<CSSStyleRule*>(rule);
574 } 620 }
575 621
576 InspectorCSSAgent::InspectorCSSAgent(InstrumentingAgents* instrumentingAgents, I nspectorCompositeState* state, InspectorDOMAgent* domAgent) 622 InspectorCSSAgent::InspectorCSSAgent(InstrumentingAgents* instrumentingAgents, I nspectorCompositeState* state, InspectorDOMAgent* domAgent)
577 : InspectorBaseAgent<InspectorCSSAgent>("CSS", instrumentingAgents, state) 623 : InspectorBaseAgent<InspectorCSSAgent>("CSS", instrumentingAgents, state)
578 , m_frontend(0) 624 , m_frontend(0)
579 , m_domAgent(domAgent) 625 , m_domAgent(domAgent)
580 , m_lastStyleSheetId(1) 626 , m_lastStyleSheetId(1)
627 , m_creatingViaInspectorStyleSheet(false)
581 { 628 {
582 m_domAgent->setDOMListener(this); 629 m_domAgent->setDOMListener(this);
583 } 630 }
584 631
585 InspectorCSSAgent::~InspectorCSSAgent() 632 InspectorCSSAgent::~InspectorCSSAgent()
586 { 633 {
587 ASSERT(!m_domAgent); 634 ASSERT(!m_domAgent);
588 reset(); 635 reset();
589 } 636 }
590 637
591 void InspectorCSSAgent::setFrontend(InspectorFrontend* frontend) 638 void InspectorCSSAgent::setFrontend(InspectorFrontend* frontend)
592 { 639 {
593 ASSERT(!m_frontend); 640 ASSERT(!m_frontend);
594 m_frontend = frontend->css(); 641 m_frontend = frontend->css();
595 } 642 }
596 643
597 void InspectorCSSAgent::clearFrontend() 644 void InspectorCSSAgent::clearFrontend()
598 { 645 {
599 ASSERT(m_frontend); 646 ASSERT(m_frontend);
600 m_frontend = 0; 647 m_frontend = 0;
601 resetNonPersistentData(); 648 resetNonPersistentData();
602 String errorString; 649 stopSelectorProfilerImpl(0, false);
603 stopSelectorProfilerImpl(&errorString, false);
604 } 650 }
605 651
606 void InspectorCSSAgent::discardAgent() 652 void InspectorCSSAgent::discardAgent()
607 { 653 {
608 m_domAgent->setDOMListener(0); 654 m_domAgent->setDOMListener(0);
609 m_domAgent = 0; 655 m_domAgent = 0;
610 } 656 }
611 657
612 void InspectorCSSAgent::restore() 658 void InspectorCSSAgent::restore()
613 { 659 {
(...skipping 21 matching lines...) Expand all
635 m_namedFlowCollectionsRequested.clear(); 681 m_namedFlowCollectionsRequested.clear();
636 if (m_updateRegionLayoutTask) 682 if (m_updateRegionLayoutTask)
637 m_updateRegionLayoutTask->reset(); 683 m_updateRegionLayoutTask->reset();
638 resetPseudoStates(); 684 resetPseudoStates();
639 } 685 }
640 686
641 void InspectorCSSAgent::enable(ErrorString*) 687 void InspectorCSSAgent::enable(ErrorString*)
642 { 688 {
643 m_state->setBoolean(CSSAgentState::cssAgentEnabled, true); 689 m_state->setBoolean(CSSAgentState::cssAgentEnabled, true);
644 m_instrumentingAgents->setInspectorCSSAgent(this); 690 m_instrumentingAgents->setInspectorCSSAgent(this);
691
692 RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader> > styleInfo s = TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader>::create();
693 Vector<InspectorStyleSheet*> styleSheets;
694 collectAllStyleSheets(styleSheets);
695 for (size_t i = 0; i < styleSheets.size(); ++i)
696 m_frontend->styleSheetAdded(styleSheets.at(i)->buildObjectForStyleSheetI nfo());
645 } 697 }
646 698
647 void InspectorCSSAgent::disable(ErrorString*) 699 void InspectorCSSAgent::disable(ErrorString*)
648 { 700 {
649 m_instrumentingAgents->setInspectorCSSAgent(0); 701 m_instrumentingAgents->setInspectorCSSAgent(0);
650 m_state->setBoolean(CSSAgentState::cssAgentEnabled, false); 702 m_state->setBoolean(CSSAgentState::cssAgentEnabled, false);
651 } 703 }
652 704
653 void InspectorCSSAgent::mediaQueryResultChanged() 705 void InspectorCSSAgent::mediaQueryResultChanged()
654 { 706 {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 { 745 {
694 if (namedFlow->flowState() == NamedFlow::FlowStateNull) 746 if (namedFlow->flowState() == NamedFlow::FlowStateNull)
695 return; 747 return;
696 748
697 ErrorString errorString; 749 ErrorString errorString;
698 RefPtr<NamedFlow> protector(namedFlow); 750 RefPtr<NamedFlow> protector(namedFlow);
699 751
700 m_frontend->regionLayoutUpdated(buildObjectForNamedFlow(&errorString, namedF low, documentNodeId)); 752 m_frontend->regionLayoutUpdated(buildObjectForNamedFlow(&errorString, namedF low, documentNodeId));
701 } 753 }
702 754
755 void InspectorCSSAgent::activeStyleSheetsUpdated(const Vector<RefPtr<StyleSheet> >& newSheets)
756 {
757 HashSet<CSSStyleSheet*> removedSheets;
758 for (CSSStyleSheetToInspectorStyleSheet::iterator it = m_cssStyleSheetToInsp ectorStyleSheet.begin(); it != m_cssStyleSheetToInspectorStyleSheet.end(); ++it) {
759 if (it->value->canBind())
760 removedSheets.add(it->key);
761 }
762
763 Vector<CSSStyleSheet*> newSheetsVector;
764 for (size_t i = 0, size = newSheets.size(); i < size; ++i) {
765 StyleSheet* newSheet = newSheets.at(i).get();
766 if (newSheet->isCSSStyleSheet()) {
767 StyleSheetAppender appender(static_cast<CSSStyleSheet*>(newSheet), n ewSheetsVector);
768 appender.run();
769 }
770 }
771
772 HashSet<CSSStyleSheet*> addedSheets;
773 for (size_t i = 0; i < newSheetsVector.size(); ++i) {
774 CSSStyleSheet* newCSSSheet = newSheetsVector.at(i);
775 if (removedSheets.contains(newCSSSheet))
776 removedSheets.remove(newCSSSheet);
777 else
778 addedSheets.add(newCSSSheet);
779 }
780
781 RefPtr<TypeBuilder::Array<TypeBuilder::CSS::StyleSheetId> > removedIds = Typ eBuilder::Array<TypeBuilder::CSS::StyleSheetId>::create();
782 for (HashSet<CSSStyleSheet*>::iterator it = removedSheets.begin(); it != rem ovedSheets.end(); ++it) {
783 RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_cssStyleSheetToInspe ctorStyleSheet.get(*it);
784 ASSERT(inspectorStyleSheet);
785 if (m_idToInspectorStyleSheet.contains(inspectorStyleSheet->id()))
786 m_frontend->styleSheetRemoved(unbindStyleSheet(inspectorStyleSheet.g et()));
787 }
788 RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader> > addedHead ers = TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader>::create();
789 for (HashSet<CSSStyleSheet*>::iterator it = addedSheets.begin(); it != added Sheets.end(); ++it) {
790 if (!m_cssStyleSheetToInspectorStyleSheet.contains(*it))
791 m_frontend->styleSheetAdded(bindStyleSheet(static_cast<CSSStyleSheet *>(*it))->buildObjectForStyleSheetInfo());
792 }
793 }
794
703 bool InspectorCSSAgent::forcePseudoState(Element* element, CSSSelector::PseudoTy pe pseudoType) 795 bool InspectorCSSAgent::forcePseudoState(Element* element, CSSSelector::PseudoTy pe pseudoType)
704 { 796 {
705 if (m_nodeIdToForcedPseudoState.isEmpty()) 797 if (m_nodeIdToForcedPseudoState.isEmpty())
706 return false; 798 return false;
707 799
708 int nodeId = m_domAgent->boundNodeId(element); 800 int nodeId = m_domAgent->boundNodeId(element);
709 if (!nodeId) 801 if (!nodeId)
710 return false; 802 return false;
711 803
712 NodeIdToForcedPseudoState::iterator it = m_nodeIdToForcedPseudoState.find(no deId); 804 NodeIdToForcedPseudoState::iterator it = m_nodeIdToForcedPseudoState.find(no deId);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 return; 892 return;
801 893
802 RefPtr<CSSComputedStyleDeclaration> computedStyleInfo = CSSComputedStyleDecl aration::create(element, true); 894 RefPtr<CSSComputedStyleDeclaration> computedStyleInfo = CSSComputedStyleDecl aration::create(element, true);
803 RefPtr<InspectorStyle> inspectorStyle = InspectorStyle::create(InspectorCSSI d(), computedStyleInfo, 0); 895 RefPtr<InspectorStyle> inspectorStyle = InspectorStyle::create(InspectorCSSI d(), computedStyleInfo, 0);
804 style = inspectorStyle->buildArrayForComputedStyle(); 896 style = inspectorStyle->buildArrayForComputedStyle();
805 } 897 }
806 898
807 void InspectorCSSAgent::getAllStyleSheets(ErrorString*, RefPtr<TypeBuilder::Arra y<TypeBuilder::CSS::CSSStyleSheetHeader> >& styleInfos) 899 void InspectorCSSAgent::getAllStyleSheets(ErrorString*, RefPtr<TypeBuilder::Arra y<TypeBuilder::CSS::CSSStyleSheetHeader> >& styleInfos)
808 { 900 {
809 styleInfos = TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader>::crea te(); 901 styleInfos = TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader>::crea te();
810 Vector<Document*> documents = m_domAgent->documents(); 902 Vector<InspectorStyleSheet*> styleSheets;
811 for (Vector<Document*>::iterator it = documents.begin(); it != documents.end (); ++it) { 903 collectAllStyleSheets(styleSheets);
812 StyleSheetList* list = (*it)->styleSheets(); 904 for (size_t i = 0; i < styleSheets.size(); ++i)
813 for (unsigned i = 0; i < list->length(); ++i) { 905 styleInfos->addItem(styleSheets.at(i)->buildObjectForStyleSheetInfo());
814 StyleSheet* styleSheet = list->item(i);
815 if (styleSheet->isCSSStyleSheet())
816 collectStyleSheets(static_cast<CSSStyleSheet*>(styleSheet), styl eInfos.get());
817 }
818 }
819 } 906 }
820 907
821 void InspectorCSSAgent::getStyleSheet(ErrorString* errorString, const String& st yleSheetId, RefPtr<TypeBuilder::CSS::CSSStyleSheetBody>& styleSheetObject) 908 void InspectorCSSAgent::getStyleSheet(ErrorString* errorString, const String& st yleSheetId, RefPtr<TypeBuilder::CSS::CSSStyleSheetBody>& styleSheetObject)
822 { 909 {
823 InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString , styleSheetId); 910 InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString , styleSheetId);
824 if (!inspectorStyleSheet) 911 if (!inspectorStyleSheet)
825 return; 912 return;
826 913
827 styleSheetObject = inspectorStyleSheet->buildObjectForStyleSheet(); 914 styleSheetObject = inspectorStyleSheet->buildObjectForStyleSheet();
828 } 915 }
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
1081 1168
1082 int InspectorCSSAgent::documentNodeWithRequestedFlowsId(Document* document) 1169 int InspectorCSSAgent::documentNodeWithRequestedFlowsId(Document* document)
1083 { 1170 {
1084 int documentNodeId = m_domAgent->boundNodeId(document); 1171 int documentNodeId = m_domAgent->boundNodeId(document);
1085 if (!documentNodeId || !m_namedFlowCollectionsRequested.contains(documentNod eId)) 1172 if (!documentNodeId || !m_namedFlowCollectionsRequested.contains(documentNod eId))
1086 return 0; 1173 return 0;
1087 1174
1088 return documentNodeId; 1175 return documentNodeId;
1089 } 1176 }
1090 1177
1091 void InspectorCSSAgent::collectStyleSheets(CSSStyleSheet* styleSheet, TypeBuilde r::Array<TypeBuilder::CSS::CSSStyleSheetHeader>* result) 1178 void InspectorCSSAgent::collectAllStyleSheets(Vector<InspectorStyleSheet*>& resu lt)
1179 {
1180 Vector<Document*> documents = m_domAgent->documents();
1181 for (Vector<Document*>::iterator it = documents.begin(); it != documents.end (); ++it) {
1182 StyleSheetList* list = (*it)->styleSheets();
1183 for (unsigned i = 0; i < list->length(); ++i) {
1184 StyleSheet* styleSheet = list->item(i);
1185 if (styleSheet->isCSSStyleSheet())
1186 collectStyleSheets(static_cast<CSSStyleSheet*>(styleSheet), resu lt);
1187 }
1188 }
1189 }
1190
1191 void InspectorCSSAgent::collectStyleSheets(CSSStyleSheet* styleSheet, Vector<Ins pectorStyleSheet*>& result)
1092 { 1192 {
1093 InspectorStyleSheet* inspectorStyleSheet = bindStyleSheet(static_cast<CSSSty leSheet*>(styleSheet)); 1193 InspectorStyleSheet* inspectorStyleSheet = bindStyleSheet(static_cast<CSSSty leSheet*>(styleSheet));
1094 result->addItem(inspectorStyleSheet->buildObjectForStyleSheetInfo()); 1194 result.append(inspectorStyleSheet);
1095 for (unsigned i = 0, size = styleSheet->length(); i < size; ++i) { 1195 for (unsigned i = 0, size = styleSheet->length(); i < size; ++i) {
1096 CSSRule* rule = styleSheet->item(i); 1196 CSSRule* rule = styleSheet->item(i);
1097 if (rule->type() == CSSRule::IMPORT_RULE) { 1197 if (rule->type() == CSSRule::IMPORT_RULE) {
1098 CSSStyleSheet* importedStyleSheet = static_cast<CSSImportRule*>(rule )->styleSheet(); 1198 CSSStyleSheet* importedStyleSheet = static_cast<CSSImportRule*>(rule )->styleSheet();
1099 if (importedStyleSheet) 1199 if (importedStyleSheet)
1100 collectStyleSheets(importedStyleSheet, result); 1200 collectStyleSheets(importedStyleSheet, result);
1101 } 1201 }
1102 } 1202 }
1103 } 1203 }
1104 1204
1105 InspectorStyleSheet* InspectorCSSAgent::bindStyleSheet(CSSStyleSheet* styleSheet ) 1205 InspectorStyleSheet* InspectorCSSAgent::bindStyleSheet(CSSStyleSheet* styleSheet )
1106 { 1206 {
1107 RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_cssStyleSheetToInspector StyleSheet.get(styleSheet); 1207 RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_cssStyleSheetToInspector StyleSheet.get(styleSheet);
1108 if (!inspectorStyleSheet) { 1208 if (!inspectorStyleSheet) {
1109 String id = String::number(m_lastStyleSheetId++); 1209 String id = String::number(m_lastStyleSheetId++);
1110 Document* document = styleSheet->ownerDocument(); 1210 Document* document = styleSheet->ownerDocument();
1111 inspectorStyleSheet = InspectorStyleSheet::create(m_domAgent->pageAgent( ), id, styleSheet, detectOrigin(styleSheet, document), InspectorDOMAgent::docume ntURLString(document), this); 1211 inspectorStyleSheet = InspectorStyleSheet::create(m_domAgent->pageAgent( ), id, styleSheet, detectOrigin(styleSheet, document), InspectorDOMAgent::docume ntURLString(document), this);
1112 m_idToInspectorStyleSheet.set(id, inspectorStyleSheet); 1212 m_idToInspectorStyleSheet.set(id, inspectorStyleSheet);
1113 m_cssStyleSheetToInspectorStyleSheet.set(styleSheet, inspectorStyleSheet ); 1213 m_cssStyleSheetToInspectorStyleSheet.set(styleSheet, inspectorStyleSheet );
1214 if (m_creatingViaInspectorStyleSheet)
1215 m_documentToInspectorStyleSheet.add(document, inspectorStyleSheet);
1114 } 1216 }
1115 return inspectorStyleSheet.get(); 1217 return inspectorStyleSheet.get();
1116 } 1218 }
1117 1219
1220 String InspectorCSSAgent::unbindStyleSheet(InspectorStyleSheet* inspectorStyleSh eet)
1221 {
1222 String id = inspectorStyleSheet->id();
1223 m_idToInspectorStyleSheet.remove(id);
1224 if (inspectorStyleSheet->pageStyleSheet())
1225 m_cssStyleSheetToInspectorStyleSheet.remove(inspectorStyleSheet->pageSty leSheet());
1226 return id;
1227 }
1228
1118 InspectorStyleSheet* InspectorCSSAgent::viaInspectorStyleSheet(Document* documen t, bool createIfAbsent) 1229 InspectorStyleSheet* InspectorCSSAgent::viaInspectorStyleSheet(Document* documen t, bool createIfAbsent)
1119 { 1230 {
1120 if (!document) { 1231 if (!document) {
1121 ASSERT(!createIfAbsent); 1232 ASSERT(!createIfAbsent);
1122 return 0; 1233 return 0;
1123 } 1234 }
1124 1235
1125 if (!document->isHTMLDocument() && !document->isSVGDocument()) 1236 if (!document->isHTMLDocument() && !document->isSVGDocument())
1126 return 0; 1237 return 0;
1127 1238
1128 RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_documentToInspectorStyle Sheet.get(document); 1239 RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_documentToInspectorStyle Sheet.get(document);
1129 if (inspectorStyleSheet || !createIfAbsent) 1240 if (inspectorStyleSheet || !createIfAbsent)
1130 return inspectorStyleSheet.get(); 1241 return inspectorStyleSheet.get();
1131 1242
1132 ExceptionCode ec = 0; 1243 ExceptionCode ec = 0;
1133 RefPtr<Element> styleElement = document->createElement("style", ec); 1244 RefPtr<Element> styleElement = document->createElement("style", ec);
1134 if (!ec) 1245 if (!ec)
1135 styleElement->setAttribute("type", "text/css", ec); 1246 styleElement->setAttribute("type", "text/css", ec);
1136 if (!ec) { 1247 if (!ec) {
1137 ContainerNode* targetNode; 1248 ContainerNode* targetNode;
1138 // HEAD is absent in ImageDocuments, for example. 1249 // HEAD is absent in ImageDocuments, for example.
1139 if (document->head()) 1250 if (document->head())
1140 targetNode = document->head(); 1251 targetNode = document->head();
1141 else if (document->body()) 1252 else if (document->body())
1142 targetNode = document->body(); 1253 targetNode = document->body();
1143 else 1254 else
1144 return 0; 1255 return 0;
1145 1256
1146 InlineStyleOverrideScope overrideScope(document); 1257 InlineStyleOverrideScope overrideScope(document);
1258 m_creatingViaInspectorStyleSheet = true;
1147 targetNode->appendChild(styleElement, ec); 1259 targetNode->appendChild(styleElement, ec);
1260 // At this point the added stylesheet will get bound through the updateA ctiveStyleSheets() invocation.
1261 // We just need to pick the respective InspectorStyleSheet from m_docume ntToInspectorStyleSheet.
1262 m_creatingViaInspectorStyleSheet = false;
1148 } 1263 }
1149 if (ec) 1264 if (ec)
1150 return 0; 1265 return 0;
1151 1266
1152 CSSStyleSheet* cssStyleSheet = 0; 1267 return m_documentToInspectorStyleSheet.get(document).get();
1153 if (styleElement->isHTMLElement())
1154 cssStyleSheet = static_cast<HTMLStyleElement*>(styleElement.get())->shee t();
1155 #if ENABLE(SVG)
1156 else if (styleElement->isSVGElement())
1157 cssStyleSheet = static_cast<SVGStyleElement*>(styleElement.get())->sheet ();
1158 #endif
1159
1160 if (!cssStyleSheet)
1161 return 0;
1162
1163 String id = String::number(m_lastStyleSheetId++);
1164 inspectorStyleSheet = InspectorStyleSheet::create(m_domAgent->pageAgent(), i d, cssStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Inspector, InspectorDOMAge nt::documentURLString(document), this);
1165 m_idToInspectorStyleSheet.set(id, inspectorStyleSheet);
1166 m_cssStyleSheetToInspectorStyleSheet.set(cssStyleSheet, inspectorStyleSheet) ;
1167 m_documentToInspectorStyleSheet.set(document, inspectorStyleSheet);
1168 return inspectorStyleSheet.get();
1169 } 1268 }
1170 1269
1171 InspectorStyleSheet* InspectorCSSAgent::assertStyleSheetForId(ErrorString* error String, const String& styleSheetId) 1270 InspectorStyleSheet* InspectorCSSAgent::assertStyleSheetForId(ErrorString* error String, const String& styleSheetId)
1172 { 1271 {
1173 IdToInspectorStyleSheet::iterator it = m_idToInspectorStyleSheet.find(styleS heetId); 1272 IdToInspectorStyleSheet::iterator it = m_idToInspectorStyleSheet.find(styleS heetId);
1174 if (it == m_idToInspectorStyleSheet.end()) { 1273 if (it == m_idToInspectorStyleSheet.end()) {
1175 *errorString = "No style sheet with given id found"; 1274 *errorString = "No style sheet with given id found";
1176 return 0; 1275 return 0;
1177 } 1276 }
1178 return it->value.get(); 1277 return it->value.get();
1179 } 1278 }
1180 1279
1181 TypeBuilder::CSS::StyleSheetOrigin::Enum InspectorCSSAgent::detectOrigin(CSSStyl eSheet* pageStyleSheet, Document* ownerDocument) 1280 TypeBuilder::CSS::StyleSheetOrigin::Enum InspectorCSSAgent::detectOrigin(CSSStyl eSheet* pageStyleSheet, Document* ownerDocument)
1182 { 1281 {
1282 if (m_creatingViaInspectorStyleSheet)
1283 return TypeBuilder::CSS::StyleSheetOrigin::Inspector;
1284
1183 TypeBuilder::CSS::StyleSheetOrigin::Enum origin = TypeBuilder::CSS::StyleShe etOrigin::Regular; 1285 TypeBuilder::CSS::StyleSheetOrigin::Enum origin = TypeBuilder::CSS::StyleShe etOrigin::Regular;
1184 if (pageStyleSheet && !pageStyleSheet->ownerNode() && pageStyleSheet->href() .isEmpty()) 1286 if (pageStyleSheet && !pageStyleSheet->ownerNode() && pageStyleSheet->href() .isEmpty())
1185 origin = TypeBuilder::CSS::StyleSheetOrigin::User_agent; 1287 origin = TypeBuilder::CSS::StyleSheetOrigin::User_agent;
1186 else if (pageStyleSheet && pageStyleSheet->ownerNode() && pageStyleSheet->ow nerNode()->nodeName() == "#document") 1288 else if (pageStyleSheet && pageStyleSheet->ownerNode() && pageStyleSheet->ow nerNode()->nodeName() == "#document")
1187 origin = TypeBuilder::CSS::StyleSheetOrigin::User; 1289 origin = TypeBuilder::CSS::StyleSheetOrigin::User;
1188 else { 1290 else {
1189 InspectorStyleSheet* viaInspectorStyleSheetForOwner = viaInspectorStyleS heet(ownerDocument, false); 1291 InspectorStyleSheet* viaInspectorStyleSheetForOwner = viaInspectorStyleS heet(ownerDocument, false);
1190 if (viaInspectorStyleSheetForOwner && pageStyleSheet == viaInspectorStyl eSheetForOwner->pageStyleSheet()) 1292 if (viaInspectorStyleSheetForOwner && pageStyleSheet == viaInspectorStyl eSheetForOwner->pageStyleSheet())
1191 origin = TypeBuilder::CSS::StyleSheetOrigin::Inspector; 1293 origin = TypeBuilder::CSS::StyleSheetOrigin::Inspector;
1192 } 1294 }
1193 return origin; 1295 return origin;
1194 } 1296 }
1195 1297
1196 PassRefPtr<TypeBuilder::CSS::CSSRule> InspectorCSSAgent::buildObjectForRule(CSSS tyleRule* rule, StyleResolver* styleResolver) 1298 PassRefPtr<TypeBuilder::CSS::CSSRule> InspectorCSSAgent::buildObjectForRule(CSSS tyleRule* rule, StyleResolver* styleResolver)
1197 { 1299 {
1198 if (!rule) 1300 if (!rule)
1199 return 0; 1301 return 0;
1200 1302
1201 // CSSRules returned by StyleResolver::styleRulesForElement lack parent poin ters since that infomation is not cheaply available. 1303 // CSSRules returned by StyleResolver::styleRulesForElement lack parent poin ters since that infomation is not cheaply available.
1202 // Since the inspector wants to walk the parent chain, we construct the full wrappers here. 1304 // Since the inspector wants to walk the parent chain, we construct the full wrappers here.
1203 // FIXME: This could be factored better. StyleResolver::styleRulesForElement should return a StyleRule vector, not a CSSRuleList. 1305 // FIXME: This could be factored better. StyleResolver::styleRulesForElement should return a StyleRule vector, not a CSSRuleList.
1204 if (!rule->parentStyleSheet()) { 1306 if (!rule->parentStyleSheet()) {
1205 rule = styleResolver->inspectorCSSOMWrappers().getWrapperForRuleInSheets (rule->styleRule(), styleResolver->document()->styleSheetCollection()); 1307 rule = styleResolver->inspectorCSSOMWrappers().getWrapperForRuleInSheets (rule->styleRule(), styleResolver->document()->styleSheetCollection());
1206 if (!rule) 1308 if (!rule)
1207 return 0; 1309 return 0;
1208 } 1310 }
1209 InspectorStyleSheet* inspectorStyleSheet = bindStyleSheet(rule->parentStyleS heet()); 1311 return bindStyleSheet(rule->parentStyleSheet())->buildObjectForRule(rule);
1210 return inspectorStyleSheet ? inspectorStyleSheet->buildObjectForRule(rule) : 0;
1211 } 1312 }
1212 1313
1213 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > InspectorCSSAgent::bu ildArrayForRuleList(CSSRuleList* ruleList, StyleResolver* styleResolver) 1314 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > InspectorCSSAgent::bu ildArrayForRuleList(CSSRuleList* ruleList, StyleResolver* styleResolver)
1214 { 1315 {
1215 RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > result = TypeBuilder: :Array<TypeBuilder::CSS::CSSRule>::create(); 1316 RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > result = TypeBuilder: :Array<TypeBuilder::CSS::CSSRule>::create();
1216 if (!ruleList) 1317 if (!ruleList)
1217 return result.release(); 1318 return result.release();
1218 1319
1219 for (unsigned i = 0, size = ruleList->length(); i < size; ++i) { 1320 for (unsigned i = 0, size = ruleList->length(); i < size; ++i) {
1220 CSSStyleRule* rule = asCSSStyleRule(ruleList->item(i)); 1321 CSSStyleRule* rule = asCSSStyleRule(ruleList->item(i));
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
1373 documentsToChange.add(element->ownerDocument()); 1474 documentsToChange.add(element->ownerDocument());
1374 } 1475 }
1375 1476
1376 m_nodeIdToForcedPseudoState.clear(); 1477 m_nodeIdToForcedPseudoState.clear();
1377 for (HashSet<Document*>::iterator it = documentsToChange.begin(), end = docu mentsToChange.end(); it != end; ++it) 1478 for (HashSet<Document*>::iterator it = documentsToChange.begin(), end = docu mentsToChange.end(); it != end; ++it)
1378 (*it)->styleResolverChanged(RecalcStyleImmediately); 1479 (*it)->styleResolverChanged(RecalcStyleImmediately);
1379 } 1480 }
1380 1481
1381 } // namespace WebCore 1482 } // namespace WebCore
1382 1483
OLDNEW
« no previous file with comments | « Source/core/inspector/InspectorCSSAgent.h ('k') | Source/core/inspector/InspectorInstrumentation.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698