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 32a79edb4fb79cafe687e354afbf527c0322bfa0..082323fe978aa923cf9b83f092f3f6f068b80978 100644 |
| --- a/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp |
| +++ b/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp |
| @@ -52,6 +52,7 @@ |
| #include "core/css/StyleSheetList.h" |
| #include "core/css/parser/CSSParser.h" |
| #include "core/css/resolver/StyleResolver.h" |
| +#include "core/css/resolver/StyleRuleUsageTracker.h" |
| #include "core/dom/DOMNodeIds.h" |
| #include "core/dom/Node.h" |
| #include "core/dom/StyleChangeReason.h" |
| @@ -301,6 +302,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 +688,8 @@ InspectorCSSAgent::~InspectorCSSAgent() {} |
| void InspectorCSSAgent::restore() { |
| if (m_state->booleanProperty(CSSAgentState::cssAgentEnabled, false)) |
| wasEnabled(); |
| + if (m_state->booleanProperty(CSSAgentState::ruleRecordingEnabled, false)) |
| + setUsageTrackerStatus(true); |
| } |
| void InspectorCSSAgent::flushPendingProtocolNotifications() { |
| @@ -748,6 +752,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); |
| + setUsageTrackerStatus(false); |
| } |
| void InspectorCSSAgent::didCommitLoadForLocalFrame(LocalFrame* frame) { |
| @@ -2036,6 +2042,16 @@ InspectorCSSAgent::buildObjectForAttributesStyle(Element* element) { |
| return inspectorStyle->buildObjectForStyle(); |
| } |
| +void InspectorCSSAgent::didAddDocument(Document* document) { |
| + if (!m_tracker) |
| + return; |
| + |
| + document->styleEngine().setRuleUsageTracker(m_tracker); |
| + document->setNeedsStyleRecalc( |
| + SubtreeStyleChange, |
| + StyleChangeReasonForTracing::create(StyleChangeReason::Inspector)); |
| +} |
| + |
| void InspectorCSSAgent::didRemoveDocument(Document* document) {} |
| void InspectorCSSAgent::didRemoveDOMNode(Node* node) { |
| @@ -2489,6 +2505,83 @@ void InspectorCSSAgent::visitLayoutTreeNodes( |
| } |
| } |
| +void InspectorCSSAgent::setUsageTrackerStatus(bool enable) { |
|
pfeldman
2016/11/02 18:38:25
rename "enable" to "enabled"
|
| + if (enable) { |
| + if (!m_tracker) |
| + m_tracker = new StyleRuleUsageTracker(); |
| + } else { |
| + m_tracker = nullptr; |
| + } |
| + |
| + 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::startRuleUsageTracking(ErrorString* errorString) { |
| + m_state->setBoolean(CSSAgentState::ruleRecordingEnabled, true); |
| + setUsageTrackerStatus(true); |
| +} |
| + |
| +std::unique_ptr<protocol::CSS::RuleUsage> |
| +InspectorCSSAgent::buildObjectForRuleUsage(CSSRule* rule, bool status) { |
| + CSSStyleRule* cssRule = static_cast<CSSStyleRule*>(rule); |
|
pfeldman
2016/11/02 18:38:25
This will not always work, you need a type check (
|
| + |
| + InspectorStyleSheet* inspectorStyleSheet = |
| + inspectorStyleSheetForRule(cssRule); |
| + if (!inspectorStyleSheet) |
| + return nullptr; |
| + |
| + std::unique_ptr<protocol::CSS::RuleUsage> result = |
| + inspectorStyleSheet->buildObjectForRuleUsage(rule, status); |
|
pfeldman
2016/11/02 18:38:25
You could use stylesheet to build rule and add usa
|
| + |
| + return result; |
| +} |
| + |
| +void InspectorCSSAgent::stopRuleUsageTracking( |
| + ErrorString* errorString, |
| + std::unique_ptr<protocol::Array<protocol::CSS::RuleUsage>>* result) { |
| + if (!m_tracker) { |
| + *errorString = "CSS rule usage tracking is not enabled"; |
| + return; |
| + } |
| + |
| + *result = protocol::Array<protocol::CSS::RuleUsage>::create(); |
| + |
| + 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* styleSheet = |
| + m_cssStyleSheetToInspectorStyleSheet.get(sheet); |
| + const CSSRuleVector ruleVector = styleSheet->flatRules(); |
| + for (auto rule : ruleVector) { |
| + if (rule->type() != CSSRule::kStyleRule) |
| + continue; |
| + |
| + CSSStyleRule* cssRule = static_cast<CSSStyleRule*>(rule.get()); |
| + |
| + StyleRule* styleRule = cssRule->styleRule(); |
| + |
| + result->get()->addItem(buildObjectForRuleUsage( |
| + rule.get(), m_tracker->getRuleList().contains(styleRule))); |
| + } |
| + } |
| + } |
| + |
| + setUsageTrackerStatus(false); |
| +} |
| + |
| DEFINE_TRACE(InspectorCSSAgent) { |
| visitor->trace(m_domAgent); |
| visitor->trace(m_inspectedFrames); |
| @@ -2502,6 +2595,7 @@ DEFINE_TRACE(InspectorCSSAgent) { |
| visitor->trace(m_invalidatedDocuments); |
| visitor->trace(m_nodeToInspectorStyleSheet); |
| visitor->trace(m_inspectorUserAgentStyleSheet); |
| + visitor->trace(m_tracker); |
| InspectorBaseAgent::trace(visitor); |
| } |