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

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

Issue 2455943003: Backend for css rule tracking (Closed)
Patch Set: Created 4 years, 2 months 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 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);
}

Powered by Google App Engine
This is Rietveld 408576698