Chromium Code Reviews| Index: third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp |
| diff --git a/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp |
| index 1d366dd242374e8f133a1cd2c1aaf046061144fb..95c904bad98ff04aed78734c5910ef25b6d13069 100644 |
| --- a/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp |
| +++ b/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp |
| @@ -301,6 +301,7 @@ std::unique_ptr<protocol::DOM::Rect> buildRectForFloatRect( |
| namespace CSSAgentState { |
| static const char cssAgentEnabled[] = "cssAgentEnabled"; |
| +static const char ruleRecordingEnabled[] = "ruleRecordingEnabled"; |
| } |
| typedef blink::protocol::CSS::Backend::EnableCallback EnableCallback; |
| @@ -686,6 +687,8 @@ InspectorCSSAgent::~InspectorCSSAgent() {} |
| void InspectorCSSAgent::restore() { |
| if (m_state->booleanProperty(CSSAgentState::cssAgentEnabled, false)) |
| wasEnabled(); |
| + if (m_state->booleanProperty(CSSAgentState::cssAgentEnabled, false)) |
|
caseq
2016/10/27 20:59:55
Nope -- wrong field name.
valih
2016/10/27 21:41:17
Done.
|
| + setTrackerStatus(true); |
| } |
| void InspectorCSSAgent::flushPendingProtocolNotifications() { |
| @@ -748,6 +751,8 @@ void InspectorCSSAgent::disable(ErrorString*) { |
| m_instrumentingAgents->removeInspectorCSSAgent(this); |
| m_state->setBoolean(CSSAgentState::cssAgentEnabled, false); |
| m_resourceContentLoader->cancel(m_resourceContentLoaderClientId); |
| + m_state->setBoolean(CSSAgentState::ruleRecordingEnabled, false); |
| + setTrackerStatus(false); |
| } |
| void InspectorCSSAgent::didCommitLoadForLocalFrame(LocalFrame* frame) { |
| @@ -765,10 +770,55 @@ void InspectorCSSAgent::fontsUpdated() { |
| frontend()->fontsUpdated(); |
| } |
| +void InspectorCSSAgent::getUnusedRules( |
| + std::unique_ptr<protocol::Array<protocol::CSS::CSSRule>>* result) { |
| + HeapVector<Member<Document>> documents = m_domAgent->documents(); |
| + for (Document* document : documents) { |
| + HeapHashSet<Member<CSSStyleSheet>>* newSheetsVector = |
| + m_documentToCSSStyleSheets.get(document); |
| + |
| + if (!newSheetsVector) |
| + continue; |
| + |
| + for (auto sheet : *newSheetsVector) { |
| + InspectorStyleSheet* insp = |
|
caseq
2016/10/27 20:59:55
s/insp/style_sheet/?
valih
2016/10/27 21:41:16
Done.
|
| + m_cssStyleSheetToInspectorStyleSheet.get(sheet); |
| + const CSSRuleVector ruleVector = insp->flatRules(); |
| + for (auto rule : ruleVector) { |
| + if (rule->type() != CSSRule::kStyleRule) |
|
caseq
2016/10/27 20:59:55
So can we handle other types of rules?
|
| + continue; |
| + CSSStyleRule* rule2 = static_cast<CSSStyleRule*>(rule.get()); |
|
caseq
2016/10/27 20:59:55
time to get more creative with variable names -- t
valih
2016/10/27 21:41:16
Done.
|
| + |
| + StyleRule* rule3 = rule2->styleRule(); |
|
caseq
2016/10/27 20:59:55
and this would be style_rule
valih
2016/10/27 21:41:17
Done.
|
| + |
| + if (m_tracker.get()->getRuleList()->contains(rule3)) { |
|
caseq
2016/10/27 20:59:55
Can you reduce this to a single statement?
valih
2016/10/27 21:41:17
Done.
|
| + result->get()->addItem(buildObjectForRuleWithStatus( |
| + static_cast<CSSStyleRule*>(rule2), 1)); |
| + } else { |
| + result->get()->addItem(buildObjectForRuleWithStatus( |
| + static_cast<CSSStyleRule*>(rule2), 0)); |
| + } |
| + } |
| + } |
| + } |
| +} |
| + |
| void InspectorCSSAgent::activeStyleSheetsUpdated(Document* document) { |
| m_invalidatedDocuments.add(document); |
| } |
| +void InspectorCSSAgent::didCommitLoad(LocalFrame*, DocumentLoader* loader) { |
| + if (!m_tracker) |
| + return; |
| + |
| + Document* document = loader->frame()->document(); |
| + |
| + document->styleEngine().setRuleUsageTracker(m_tracker); |
| + document->setNeedsStyleRecalc( |
| + SubtreeStyleChange, |
| + StyleChangeReasonForTracing::create(StyleChangeReason::Inspector)); |
| +} |
| + |
| void InspectorCSSAgent::updateActiveStyleSheets( |
| Document* document, |
| StyleSheetsUpdateType styleSheetsUpdateType) { |
| @@ -2473,6 +2523,57 @@ void InspectorCSSAgent::visitLayoutTreeNodes( |
| } |
| } |
| +void InspectorCSSAgent::setTrackerStatus(bool enable) { |
| + if (enable) { |
| + if (!m_tracker) |
| + m_tracker = new StyleRuleUsageTracker; |
|
caseq
2016/10/27 20:59:55
new StyleRuleUsageTracker()
valih
2016/10/27 21:41:16
Done.
|
| + } else { |
| + m_tracker = 0; |
|
caseq
2016/10/27 20:59:55
s/0/nullptr/
valih
2016/10/27 21:41:16
Done.
|
| + } |
| + |
| + HeapVector<Member<Document>> documents = m_domAgent->documents(); |
| + for (Document* document : documents) { |
| + document->styleEngine().setRuleUsageTracker(m_tracker); |
| + |
| + document->setNeedsStyleRecalc( |
| + SubtreeStyleChange, |
| + StyleChangeReasonForTracing::create(StyleChangeReason::Inspector)); |
| + } |
| +} |
| + |
| +void InspectorCSSAgent::setSelectorRecording(ErrorString* errorString, |
| + bool enable) { |
| + if (enable) { |
|
caseq
2016/10/27 20:59:55
get rid of this if, you don't need it.
valih
2016/10/27 21:41:16
Done.
|
| + m_state->setBoolean(CSSAgentState::ruleRecordingEnabled, true); |
| + setTrackerStatus(enable); |
| + } else { |
| + m_state->setBoolean(CSSAgentState::ruleRecordingEnabled, false); |
| + setTrackerStatus(false); |
| + } |
| +} |
| + |
| +std::unique_ptr<protocol::CSS::CSSRule> |
| +InspectorCSSAgent::buildObjectForRuleWithStatus(CSSStyleRule* rule, |
| + bool status) { |
| + InspectorStyleSheet* inspectorStyleSheet = inspectorStyleSheetForRule(rule); |
| + if (!inspectorStyleSheet) |
| + return nullptr; |
| + |
| + std::unique_ptr<protocol::CSS::CSSRule> result = |
| + inspectorStyleSheet->buildObjectForRuleWithoutMedia(rule); |
| + result->setMedia(buildMediaListChain(rule)); |
| + result->setStatus(status); |
| + return result; |
| +} |
| + |
| +void InspectorCSSAgent::getRuleList( |
| + ErrorString* errorString, |
| + std::unique_ptr<protocol::Array<protocol::CSS::CSSRule>>* result) { |
| + *result = protocol::Array<protocol::CSS::CSSRule>::create(); |
| + if (m_tracker) |
|
caseq
2016/10/27 20:59:55
if (!m_tracker) {
*errorString = "CSS rule usage
valih
2016/10/27 21:41:16
Done.
|
| + getUnusedRules(result); |
| +} |
| + |
| DEFINE_TRACE(InspectorCSSAgent) { |
| visitor->trace(m_domAgent); |
| visitor->trace(m_inspectedFrames); |
| @@ -2486,6 +2587,7 @@ DEFINE_TRACE(InspectorCSSAgent) { |
| visitor->trace(m_invalidatedDocuments); |
| visitor->trace(m_nodeToInspectorStyleSheet); |
| visitor->trace(m_inspectorUserAgentStyleSheet); |
| + visitor->trace(m_tracker); |
| InspectorBaseAgent::trace(visitor); |
| } |