OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |