Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Unified Diff: third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp

Issue 2455943003: Backend for css rule tracking (Closed)
Patch Set: Backend for CSS Rule tracking. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 058840f2200e8dd289eece5a76a781a555db16c3..de63a15e1b0eb8c7802aa4b3575546b0fb4c5417 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/DOMException.h"
#include "core/dom/DOMNodeIds.h"
#include "core/dom/Node.h"
@@ -302,6 +303,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;
@@ -687,6 +689,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() {
@@ -750,6 +754,8 @@ Response InspectorCSSAgent::disable() {
m_instrumentingAgents->removeInspectorCSSAgent(this);
m_state->setBoolean(CSSAgentState::cssAgentEnabled, false);
m_resourceContentLoader->cancel(m_resourceContentLoaderClientId);
+ m_state->setBoolean(CSSAgentState::ruleRecordingEnabled, false);
+ setUsageTrackerStatus(false);
return Response::OK();
}
@@ -2001,6 +2007,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) {
@@ -2447,6 +2463,81 @@ void InspectorCSSAgent::visitLayoutTreeNodes(
}
}
+void InspectorCSSAgent::setUsageTrackerStatus(bool enabled) {
+ if (enabled) {
+ 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));
+ }
+}
+
+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) {
+ if (!m_tracker) {
+ return Response::Error("CSS rule usage tracking is not enabled");
+ }
+
+ *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(cssRule, m_tracker->contains(styleRule)));
+ }
+ }
+ }
+
+ setUsageTrackerStatus(false);
+
+ return Response::OK();
+}
+
DEFINE_TRACE(InspectorCSSAgent) {
visitor->trace(m_domAgent);
visitor->trace(m_inspectedFrames);
@@ -2460,6 +2551,7 @@ DEFINE_TRACE(InspectorCSSAgent) {
visitor->trace(m_invalidatedDocuments);
visitor->trace(m_nodeToInspectorStyleSheet);
visitor->trace(m_inspectorUserAgentStyleSheet);
+ visitor->trace(m_tracker);
InspectorBaseAgent::trace(visitor);
}

Powered by Google App Engine
This is Rietveld 408576698