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

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: 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
« no previous file with comments | « Source/core/inspector/LayoutEditor.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/inspector/LayoutEditor.cpp
diff --git a/Source/core/inspector/LayoutEditor.cpp b/Source/core/inspector/LayoutEditor.cpp
index 235c9052e24cdb550e15bf0660ab9410591cd6e6..d966cee54865ffa03e84e3784aa13bc4d9aa0139 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
@@ -209,7 +204,8 @@ LayoutEditor::LayoutEditor(InspectorCSSAgent* cssAgent, InspectorDOMAgent* domAg
, m_changingProperty(CSSPropertyInvalid)
, m_propertyInitialValue(0)
, m_isDirty(false)
- , m_currentRuleIndex(-1)
+ , m_matchedRules(StaticCSSRuleList::create())
+ , m_currentRuleIndex(0)
{
}
@@ -231,7 +227,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->length();
}
PassRefPtr<JSONObject> LayoutEditor::buildJSONInfo() const
@@ -265,7 +262,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 +329,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));
}
}
@@ -358,69 +352,29 @@ void LayoutEditor::clearSelection(bool commitChanges)
m_element.clear();
m_isDirty = false;
- m_matchedRules.clear();
- m_currentRuleIndex = -1;
+ m_matchedRules = StaticCSSRuleList::create();
+ 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->length();
+}
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()
@@ -429,35 +383,33 @@ String LayoutEditor::currentSelectorInfo()
return String();
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();
@@ -477,4 +429,35 @@ String LayoutEditor::currentSelectorInfo()
return object->toJSONString();
}
+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());
+ bool forceImportant = false;
+
+ if (effectiveDeclaration) {
+ CSSStyleRule* effectiveRule = nullptr;
+ if (effectiveDeclaration->parentRule() && effectiveDeclaration->parentRule()->type() == CSSRule::STYLE_RULE)
+ effectiveRule = toCSSStyleRule(effectiveDeclaration->parentRule());
+
+ unsigned effectiveRuleIndex = m_matchedRules->length();
+ for (unsigned i = 0; i < m_matchedRules->length(); ++i) {
+ if (m_matchedRules->item(i) == effectiveRule) {
+ effectiveRuleIndex = i;
+ break;
+ }
+ }
+ forceImportant = effectiveDeclaration->getPropertyPriority(getPropertyNameString(m_changingProperty)) == "important";
+ 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
« no previous file with comments | « Source/core/inspector/LayoutEditor.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698