| 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 655a092e4b9f40c5dd5a4012fee0c83c5badb6d0..b0c68eb5a607796e2269f86b3a422b92957b8f76 100644
|
| --- a/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp
|
| +++ b/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp
|
| @@ -690,7 +690,7 @@ void InspectorCSSAgent::restore() {
|
| if (m_state->booleanProperty(CSSAgentState::cssAgentEnabled, false))
|
| wasEnabled();
|
| if (m_state->booleanProperty(CSSAgentState::ruleRecordingEnabled, false))
|
| - setUsageTrackerStatus(true);
|
| + setCoverageEnabled(true);
|
| }
|
|
|
| void InspectorCSSAgent::flushPendingProtocolNotifications() {
|
| @@ -755,7 +755,7 @@ Response InspectorCSSAgent::disable() {
|
| m_state->setBoolean(CSSAgentState::cssAgentEnabled, false);
|
| m_resourceContentLoader->cancel(m_resourceContentLoaderClientId);
|
| m_state->setBoolean(CSSAgentState::ruleRecordingEnabled, false);
|
| - setUsageTrackerStatus(false);
|
| + setCoverageEnabled(false);
|
| return Response::OK();
|
| }
|
|
|
| @@ -2414,82 +2414,70 @@ void InspectorCSSAgent::visitLayoutTreeNodes(
|
| }
|
| }
|
|
|
| -void InspectorCSSAgent::setUsageTrackerStatus(bool enabled) {
|
| - if (enabled) {
|
| - if (!m_tracker)
|
| - m_tracker = new StyleRuleUsageTracker();
|
| - } else {
|
| - m_tracker = nullptr;
|
| - }
|
| +void InspectorCSSAgent::setCoverageEnabled(bool enabled) {
|
| + if (enabled == !!m_tracker)
|
| + return;
|
| + m_tracker = enabled ? new StyleRuleUsageTracker() : nullptr;
|
|
|
| - HeapVector<Member<Document>> documents = m_domAgent->documents();
|
| - for (Document* document : documents) {
|
| + for (Document* document : m_domAgent->documents())
|
| document->styleEngine().setRuleUsageTracker(m_tracker);
|
| +}
|
| +
|
| +Response InspectorCSSAgent::startRuleUsageTracking() {
|
| + m_state->setBoolean(CSSAgentState::ruleRecordingEnabled, true);
|
| + setCoverageEnabled(true);
|
|
|
| + for (Document* document : m_domAgent->documents()) {
|
| document->setNeedsStyleRecalc(
|
| SubtreeStyleChange,
|
| StyleChangeReasonForTracing::create(StyleChangeReason::Inspector));
|
| + document->updateStyleAndLayoutTree();
|
| }
|
| -}
|
|
|
| -Response InspectorCSSAgent::startRuleUsageTracking() {
|
| - m_state->setBoolean(CSSAgentState::ruleRecordingEnabled, true);
|
| - setUsageTrackerStatus(true);
|
| return Response::OK();
|
| }
|
|
|
| -std::unique_ptr<protocol::CSS::RuleUsage>
|
| -InspectorCSSAgent::buildObjectForRuleUsage(CSSStyleRule* rule, bool used) {
|
| - InspectorStyleSheet* inspectorStyleSheet = inspectorStyleSheetForRule(rule);
|
| - if (!inspectorStyleSheet)
|
| - return nullptr;
|
| -
|
| - std::unique_ptr<protocol::CSS::RuleUsage> result =
|
| - inspectorStyleSheet->buildObjectForRuleUsage(rule, used);
|
| -
|
| - return result;
|
| +Response InspectorCSSAgent::stopRuleUsageTracking(
|
| + std::unique_ptr<protocol::Array<protocol::CSS::RuleUsage>>* result) {
|
| + Response response = takeCoverageDelta(result);
|
| + setCoverageEnabled(false);
|
| + return response;
|
| }
|
|
|
| -Response InspectorCSSAgent::stopRuleUsageTracking(
|
| +Response InspectorCSSAgent::takeCoverageDelta(
|
| std::unique_ptr<protocol::Array<protocol::CSS::RuleUsage>>* result) {
|
| - if (!m_tracker) {
|
| + if (!m_tracker)
|
| return Response::Error("CSS rule usage tracking is not enabled");
|
| - }
|
|
|
| - *result = protocol::Array<protocol::CSS::RuleUsage>::create();
|
| + StyleRuleUsageTracker::RuleListByStyleSheet coverageDelta =
|
| + m_tracker->takeDelta();
|
|
|
| - HeapVector<Member<Document>> documents = m_domAgent->documents();
|
| - for (Document* document : documents) {
|
| - HeapHashSet<Member<CSSStyleSheet>>* newSheetsVector =
|
| - m_documentToCSSStyleSheets.at(document);
|
| + *result = protocol::Array<protocol::CSS::RuleUsage>::create();
|
|
|
| - if (!newSheetsVector)
|
| + for (const auto& entry : coverageDelta) {
|
| + const CSSStyleSheet* cssStyleSheet = entry.key.get();
|
| + InspectorStyleSheet* styleSheet = m_cssStyleSheetToInspectorStyleSheet.at(
|
| + const_cast<CSSStyleSheet*>(cssStyleSheet));
|
| + if (!styleSheet)
|
| continue;
|
|
|
| - for (auto sheet : *newSheetsVector) {
|
| - InspectorStyleSheet* styleSheet =
|
| - m_cssStyleSheetToInspectorStyleSheet.at(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();
|
| -
|
| - std::unique_ptr<protocol::CSS::RuleUsage> protocolRule =
|
| - buildObjectForRuleUsage(cssRule, m_tracker->contains(styleRule));
|
| - if (!protocolRule)
|
| - continue;
|
| -
|
| - result->get()->addItem(std::move(protocolRule));
|
| + HeapHashMap<Member<const StyleRule>, Member<CSSStyleRule>> ruleToCSSRule;
|
| + const CSSRuleVector& cssRules = styleSheet->flatRules();
|
| + for (auto cssRule : cssRules) {
|
| + if (cssRule->type() != CSSRule::kStyleRule)
|
| + continue;
|
| + CSSStyleRule* cssStyleRule = asCSSStyleRule(cssRule);
|
| + ruleToCSSRule.set(cssStyleRule->styleRule(), cssStyleRule);
|
| + }
|
| + for (auto usedRule : entry.value) {
|
| + CSSStyleRule* cssStyleRule = ruleToCSSRule.at(usedRule);
|
| + if (std::unique_ptr<protocol::CSS::RuleUsage> ruleUsageObject =
|
| + styleSheet->buildObjectForRuleUsage(cssStyleRule, true)) {
|
| + (*result)->addItem(std::move(ruleUsageObject));
|
| }
|
| }
|
| }
|
|
|
| - setUsageTrackerStatus(false);
|
| -
|
| return Response::OK();
|
| }
|
|
|
|
|