| 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..d4adec71226007bd71a24ccd90922d5679117ca9 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::ruleRecordingEnabled, false))
|
| + 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,51 @@ 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* 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(buildObjectForRuleWithStatus(
|
| + static_cast<CSSStyleRule*>(cssRule),
|
| + m_tracker.get()->getRuleList()->contains(styleRule)));
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| 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 +2519,56 @@ void InspectorCSSAgent::visitLayoutTreeNodes(
|
| }
|
| }
|
|
|
| +void InspectorCSSAgent::setTrackerStatus(bool enable) {
|
| + 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::setSelectorRecording(ErrorString* errorString,
|
| + bool enable) {
|
| + m_state->setBoolean(CSSAgentState::ruleRecordingEnabled, enable);
|
| + setTrackerStatus(enable);
|
| +}
|
| +
|
| +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) {
|
| + *errorString = "CSS rule usage tracking is not enabled";
|
| + return;
|
| + }
|
| + getUnusedRules(result);
|
| +}
|
| +
|
| DEFINE_TRACE(InspectorCSSAgent) {
|
| visitor->trace(m_domAgent);
|
| visitor->trace(m_inspectedFrames);
|
| @@ -2486,6 +2582,7 @@ DEFINE_TRACE(InspectorCSSAgent) {
|
| visitor->trace(m_invalidatedDocuments);
|
| visitor->trace(m_nodeToInspectorStyleSheet);
|
| visitor->trace(m_inspectorUserAgentStyleSheet);
|
| + visitor->trace(m_tracker);
|
| InspectorBaseAgent::trace(visitor);
|
| }
|
|
|
|
|