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

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

Issue 1577723002: Devtools: Add editable keyframes to the styles sidebar pane (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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/InspectorStyleSheet.cpp
diff --git a/third_party/WebKit/Source/core/inspector/InspectorStyleSheet.cpp b/third_party/WebKit/Source/core/inspector/InspectorStyleSheet.cpp
index ab8a65045d90f6d22913eef4949d64bfcaaaae52..48363caade63f2e51ec30facd957897ca0bcd3d9 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorStyleSheet.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorStyleSheet.cpp
@@ -371,6 +371,29 @@ bool verifyStyleText(Document* document, const String& text)
return verifyRuleText(document, "div {" + text + "}");
}
+bool verifyKeyframeKeyText(Document* document, const String& keyText)
+{
+ DEFINE_STATIC_LOCAL(String, bogusPropertyName, ("-webkit-boguz-propertee"));
+ RefPtrWillBeRawPtr<StyleSheetContents> styleSheet = StyleSheetContents::create(strictCSSParserContext());
+ RuleSourceDataList sourceData;
+ String text = "@keyframes boguzAnim { " + keyText + " { " + bogusPropertyName + ": none; } }";
pfeldman 2016/01/13 00:08:19 Just inline bogusPropertyName it here and below.
samli 2016/01/13 00:53:37 In the other methods too? They check the property
+ StyleSheetHandler handler(text, document, &sourceData);
+ CSSParser::parseSheetForInspector(parserContextForDocument(document), styleSheet.get(), text, handler);
+
+ // Exactly two should be parsed.
+ unsigned ruleCount = sourceData.size();
+ if (ruleCount != 2 || sourceData.at(0)->type != StyleRule::Keyframes || sourceData.at(1)->type != StyleRule::Keyframe)
+ return false;
+
+ // Exactly one property should be in keyframe rule.
+ WillBeHeapVector<CSSPropertySourceData>& propertyData = sourceData.at(1)->styleSourceData->propertyData;
+ unsigned propertyCount = propertyData.size();
+ if (propertyCount != 1)
+ return false;
+
+ return true;
+}
+
bool verifySelectorText(Document* document, const String& selectorText)
{
DEFINE_STATIC_LOCAL(String, bogusPropertyName, ("-webkit-boguz-propertee"));
@@ -995,6 +1018,34 @@ RefPtrWillBeRawPtr<CSSStyleRule> InspectorStyleSheet::setRuleSelector(const Sour
return styleRule;
}
+PassRefPtrWillBeRawPtr<CSSKeyframeRule> InspectorStyleSheet::setKeyframeKey(const SourceRange& range, const String& text, SourceRange* newRange, String* oldText, ExceptionState& exceptionState)
+{
+ if (!verifyKeyframeKeyText(m_pageStyleSheet->ownerDocument(), text)) {
+ exceptionState.throwDOMException(SyntaxError, "Keyframe key text is not valid.");
+ return nullptr;
+ }
+
+ RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = findRuleByHeaderRange(range);
+ if (!sourceData || !sourceData->styleSourceData) {
+ exceptionState.throwDOMException(NotFoundError, "Source range didn't match existing source range");
+ return nullptr;
+ }
+
+ RefPtrWillBeRawPtr<CSSRule> rule = ruleForSourceData(sourceData);
+ if (!rule || !rule->parentStyleSheet() || rule->type() != CSSRule::KEYFRAME_RULE) {
+ exceptionState.throwDOMException(NotFoundError, "Source range didn't match existing style source range");
+ return nullptr;
+ }
+
+ RefPtrWillBeRawPtr<CSSKeyframeRule> keyframeRule = toCSSKeyframeRule(rule.get());
+ keyframeRule->setKeyText(text, exceptionState);
+
+ replaceText(sourceData->ruleHeaderRange, text, newRange, oldText);
+ onStyleSheetTextChanged();
+
+ return keyframeRule;
+}
+
PassRefPtrWillBeRawPtr<CSSRule> InspectorStyleSheet::setStyleText(const SourceRange& range, const String& text, SourceRange* newRange, String* oldText, ExceptionState& exceptionState)
{
if (!verifyStyleText(m_pageStyleSheet->ownerDocument(), text)) {
@@ -1369,6 +1420,24 @@ PassRefPtr<TypeBuilder::CSS::CSSRule> InspectorStyleSheet::buildObjectForRuleWit
return result.release();
}
+PassRefPtr<TypeBuilder::CSS::CSSKeyframeRule> InspectorStyleSheet::buildObjectForKeyframeRule(CSSKeyframeRule* keyframeRule)
+{
+ CSSStyleSheet* styleSheet = pageStyleSheet();
+ if (!styleSheet)
+ return nullptr;
+
+ RefPtr<TypeBuilder::CSS::Value> keyText = TypeBuilder::CSS::Value::create().setText(keyframeRule->keyText());
+ keyText->setRange(buildSourceRangeObject(sourceDataForRule(keyframeRule)->ruleHeaderRange));
+ RefPtr<TypeBuilder::CSS::CSSKeyframeRule> result = TypeBuilder::CSS::CSSKeyframeRule::create()
+ // TODO(samli): keyText() normalises 'from' and 'to' keyword values.
+ .setKeyText(keyText)
+ .setOrigin(m_origin)
+ .setStyle(buildObjectForStyle(keyframeRule->style()));
+ if (canBind(m_origin) && !id().isEmpty())
+ result->setStyleSheetId(id());
+ return result.release();
+}
+
bool InspectorStyleSheet::getText(String* result)
{
if (m_sourceData) {

Powered by Google App Engine
This is Rietveld 408576698