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

Unified Diff: Source/core/inspector/LayoutEditor.cpp

Issue 1310923003: Devtools [LayoutEditor]: Patch values in the selected rule (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@medias
Patch Set: Address comments Created 5 years, 3 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: Source/core/inspector/LayoutEditor.cpp
diff --git a/Source/core/inspector/LayoutEditor.cpp b/Source/core/inspector/LayoutEditor.cpp
index d95854df1cb05a6bec0c7a402549309195fa2b03..ef270de455b862a4b0908830df00849abee0f325 100644
--- a/Source/core/inspector/LayoutEditor.cpp
+++ b/Source/core/inspector/LayoutEditor.cpp
@@ -8,7 +8,7 @@
#include "core/css/CSSComputedStyleDeclaration.h"
#include "core/css/CSSImportRule.h"
#include "core/css/CSSMediaRule.h"
-#include "core/css/CSSRuleList.h"
+#include "core/css/CSSStyleRule.h"
#include "core/css/MediaList.h"
#include "core/dom/NodeComputedStyle.h"
#include "core/dom/StaticNodeList.h"
@@ -145,11 +145,6 @@ float toValidValue(CSSPropertyID propertyId, float newValue)
return newValue;
}
-bool comparePairs(const std::pair<unsigned, CSSStyleRule*>& lhs, const std::pair<unsigned, CSSStyleRule*>& rhs)
-{
- return lhs.first < rhs.first;
-}
-
InspectorHighlightConfig affectedNodesHighlightConfig()
{
// TODO: find a better color
@@ -231,7 +226,8 @@ void LayoutEditor::selectNode(Node* node)
m_element = element;
m_changingProperty = CSSPropertyInvalid;
m_propertyInitialValue = 0;
- initializeCSSRules();
+ m_matchedRules = m_cssAgent->matchedRulesList(m_element.get());
+ m_currentRuleIndex = m_matchedRules ? m_matchedRules->length() : 0;
}
PassRefPtr<JSONObject> LayoutEditor::buildJSONInfo() const
@@ -265,7 +261,7 @@ PassRefPtr<JSONObject> LayoutEditor::buildJSONInfo() const
RefPtrWillBeRawPtr<CSSPrimitiveValue> LayoutEditor::getPropertyCSSValue(CSSPropertyID property) const
{
- RefPtrWillBeRawPtr<CSSStyleDeclaration> style = m_cssAgent->findEffectiveDeclaration(m_element.get(), property);
+ RefPtrWillBeRawPtr<CSSStyleDeclaration> style = m_cssAgent->findEffectiveDeclaration(property, m_matchedRules.get(), m_element->style());
if (!style)
return nullptr;
@@ -332,11 +328,8 @@ void LayoutEditor::overlayStartedPropertyChange(const String& anchorName)
void LayoutEditor::overlayPropertyChanged(float cssDelta)
{
if (m_changingProperty && m_factor) {
- String errorString;
float newValue = toValidValue(m_changingProperty, cssDelta / m_factor + m_propertyInitialValue);
- m_cssAgent->setCSSPropertyValue(&errorString, m_element.get(), m_changingProperty, truncateZeroes(String::format("%.2f", newValue)) + CSSPrimitiveValue::unitTypeToString(m_valueUnitType));
- if (!errorString)
- m_isDirty = true;
+ m_isDirty |= setCSSPropertyValueInCurrentRule(truncateZeroes(String::format("%.2f", newValue)) + CSSPrimitiveValue::unitTypeToString(m_valueUnitType));
}
}
@@ -360,68 +353,28 @@ void LayoutEditor::clearSelection(bool commitChanges)
m_isDirty = false;
m_matchedRules.clear();
m_cachedSelectorsInfo.clear();
- m_currentRuleIndex = -1;
+ m_currentRuleIndex = 0;
}
-void LayoutEditor::initializeCSSRules()
+bool LayoutEditor::currentStyleIsInline()
{
- if (!m_element)
- return;
-
- Document* ownerDocument = m_element->ownerDocument();
- // A non-active document has no styles.
- if (!ownerDocument->isActive())
- return;
-
- // Matched rules.
- StyleResolver& styleResolver = ownerDocument->ensureStyleResolver();
- PseudoId elementPseudoId = m_element->pseudoId();
- m_element->updateDistribution();
- RefPtrWillBeRawPtr<CSSRuleList> matchedRules = styleResolver.pseudoCSSRulesForElement(m_element.get(), elementPseudoId, StyleResolver::AllCSSRules);
- if (!matchedRules)
- return;
-
- HashSet<CSSStyleRule*> uniqRulesSet;
- Vector<CSSStyleRule*> uniqRules;
- for (unsigned i = matchedRules->length(); i > 0; --i) {
- CSSRule* rule = matchedRules->item(i);
- if (!rule || rule->type() != CSSRule::STYLE_RULE || !rule->parentStyleSheet())
- continue;
-
- CSSStyleRule* styleRule = toCSSStyleRule(rule);
-
- if (uniqRulesSet.contains(styleRule))
- continue;
- uniqRulesSet.add(styleRule);
- uniqRules.append(styleRule);
- }
- Vector<std::pair<unsigned, CSSStyleRule*>> selectors;
- for (unsigned i = 0; i < uniqRules.size(); ++i) {
- TrackExceptionState exceptionState;
- RefPtrWillBeRawPtr<StaticElementList> elements = ownerDocument->querySelectorAll(AtomicString(uniqRules[i]->selectorText()), exceptionState);
- unsigned length = exceptionState.hadException() ? 0: elements->length();
- selectors.append(std::make_pair(length, uniqRules[i]));
- }
-
- std::sort(selectors.begin(), selectors.end(), &comparePairs);
- for (size_t i = 0; i < selectors.size(); ++i)
- m_matchedRules.append(selectors[i].second);
-};
+ return m_currentRuleIndex == (m_matchedRules ? m_matchedRules->length() : 0);
+}
void LayoutEditor::nextSelector()
{
- if (static_cast<size_t>(m_currentRuleIndex + 1) == m_matchedRules.size())
+ if (m_currentRuleIndex == 0)
return;
- m_currentRuleIndex++;
+ m_currentRuleIndex--;
}
void LayoutEditor::previousSelector()
{
- if (m_currentRuleIndex == -1)
+ if (currentStyleIsInline())
return;
- m_currentRuleIndex--;
+ m_currentRuleIndex++;
}
String LayoutEditor::currentSelectorInfo()
@@ -433,35 +386,33 @@ String LayoutEditor::currentSelectorInfo()
return m_cachedSelectorsInfo.get(m_currentRuleIndex);
RefPtr<JSONObject> object = JSONObject::create();
- String currentSelectorText = m_currentRuleIndex == -1 ? "inline style" : m_matchedRules[m_currentRuleIndex]->selectorText();
+ String currentSelectorText = currentStyleIsInline() ? "inline style" : toCSSStyleRule(m_matchedRules->item(m_currentRuleIndex))->selectorText();
object->setString("selector", currentSelectorText);
Document* ownerDocument = m_element->ownerDocument();
- if (!ownerDocument->isActive() || m_currentRuleIndex == -1)
+ if (!ownerDocument->isActive() || currentStyleIsInline())
return object->toJSONString();
- if (m_currentRuleIndex != -1) {
- bool hasSameSelectors = false;
- for (size_t i = 0; i < m_matchedRules.size(); i++) {
- if (i != static_cast<unsigned>(m_currentRuleIndex) && m_matchedRules[i]->selectorText() == currentSelectorText) {
- hasSameSelectors = true;
- break;
- }
+ bool hasSameSelectors = false;
+ for (unsigned i = 0; i < m_matchedRules->length(); i++) {
+ if (i != m_currentRuleIndex && toCSSStyleRule(m_matchedRules->item(i))->selectorText() == currentSelectorText) {
+ hasSameSelectors = true;
+ break;
}
+ }
- if (hasSameSelectors) {
- Vector<String> medias;
- buildMediaListChain(m_matchedRules[m_currentRuleIndex].get(), medias);
- RefPtr<JSONArray> mediasJSONArray = JSONArray::create();
- for (size_t i = 0; i < medias.size(); ++i)
- mediasJSONArray->pushString(medias[i]);
+ if (hasSameSelectors) {
+ Vector<String> medias;
+ buildMediaListChain(m_matchedRules->item(m_currentRuleIndex), medias);
+ RefPtr<JSONArray> mediasJSONArray = JSONArray::create();
+ for (size_t i = 0; i < medias.size(); ++i)
+ mediasJSONArray->pushString(medias[i]);
- object->setArray("medias", mediasJSONArray.release());
- }
+ object->setArray("medias", mediasJSONArray.release());
}
TrackExceptionState exceptionState;
- RefPtrWillBeRawPtr<StaticElementList> elements = ownerDocument->querySelectorAll(AtomicString(m_matchedRules[m_currentRuleIndex]->selectorText()), exceptionState);
+ RefPtrWillBeRawPtr<StaticElementList> elements = ownerDocument->querySelectorAll(AtomicString(currentSelectorText), exceptionState);
if (!elements || exceptionState.hadException())
return object->toJSONString();
@@ -482,4 +433,37 @@ String LayoutEditor::currentSelectorInfo()
return m_cachedSelectorsInfo.get(m_currentRuleIndex);
}
+bool LayoutEditor::setCSSPropertyValueInCurrentRule(const String& value)
+{
+ if (!m_element)
+ return false;
+
+ RefPtrWillBeRawPtr<CSSStyleDeclaration> effectiveDeclaration = m_cssAgent->findEffectiveDeclaration(m_changingProperty, m_matchedRules.get(), m_element->style());
+
+ CSSStyleRule* effectiveRule = nullptr;
+ if (effectiveDeclaration && effectiveDeclaration->parentRule() && effectiveDeclaration->parentRule()->type() == CSSRule::STYLE_RULE)
+ effectiveRule = toCSSStyleRule(effectiveDeclaration->parentRule());
+
+ String longhand = getPropertyNameString(m_changingProperty);
+ bool forceImportant = effectiveDeclaration && effectiveDeclaration->getPropertyPriority(longhand) == "important";
+
+ unsigned size = m_matchedRules ? m_matchedRules->length() : 0;
dgozman 2015/09/03 23:04:20 Let's make it non-null.
sergeyv 2015/09/03 23:30:27 Done.
+ unsigned effectiveRuleIndex = size;
+ if (effectiveDeclaration) {
dgozman 2015/09/03 23:04:20 Let's have a single |if (effectiveDeclaration)|.
sergeyv 2015/09/03 23:30:27 Done.
+ for (unsigned i = 0; i < size; ++i) {
+ if (m_matchedRules->item(i) == effectiveRule) {
+ effectiveRuleIndex = i;
+ break;
+ }
+ }
+ }
+
+ forceImportant |= effectiveRuleIndex > m_currentRuleIndex;
+ CSSStyleDeclaration* style = currentStyleIsInline() ? m_element->style() : toCSSStyleRule(m_matchedRules->item(m_currentRuleIndex))->style();
+
+ String errorString;
+ m_cssAgent->setCSSPropertyValue(&errorString, m_element.get(), style, m_changingProperty, value, forceImportant);
+ return errorString.isEmpty();
+}
+
} // namespace blink
« Source/core/inspector/InspectorCSSAgent.cpp ('K') | « Source/core/inspector/LayoutEditor.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698