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

Side by Side Diff: Source/core/inspector/LayoutEditor.cpp

Issue 1296013002: Devtools [LayoutEditor]: Support an editing of ems/rems/percentage (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add a comment about the hack Created 5 years, 4 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 unified diff | Download patch
« no previous file with comments | « Source/core/inspector/LayoutEditor.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/inspector/LayoutEditor.h" 6 #include "core/inspector/LayoutEditor.h"
7 7
8 #include "core/css/CSSComputedStyleDeclaration.h" 8 #include "core/css/CSSComputedStyleDeclaration.h"
9 #include "core/css/CSSPrimitiveValue.h" 9 #include "core/dom/NodeComputedStyle.h"
10 #include "core/frame/FrameView.h" 10 #include "core/frame/FrameView.h"
11 #include "core/inspector/InspectorCSSAgent.h" 11 #include "core/inspector/InspectorCSSAgent.h"
12 #include "core/inspector/InspectorHighlight.h" 12 #include "core/inspector/InspectorHighlight.h"
13 #include "core/layout/LayoutBox.h" 13 #include "core/layout/LayoutBox.h"
14 #include "core/layout/LayoutInline.h" 14 #include "core/layout/LayoutInline.h"
15 #include "core/layout/LayoutObject.h" 15 #include "core/layout/LayoutObject.h"
16 #include "core/style/ComputedStyle.h"
16 #include "platform/JSONValues.h" 17 #include "platform/JSONValues.h"
17 18
18 namespace blink { 19 namespace blink {
19 20
20 namespace { 21 namespace {
21 22
22 PassRefPtr<JSONObject> createAnchor(const FloatPoint& point, const String& type, const String& propertyName, FloatPoint deltaVector, PassRefPtr<JSONObject> valu eDescription) 23 PassRefPtr<JSONObject> createAnchor(const FloatPoint& point, const String& type, const String& propertyName, FloatPoint deltaVector, PassRefPtr<JSONObject> valu eDescription)
23 { 24 {
24 RefPtr<JSONObject> object = JSONObject::create(); 25 RefPtr<JSONObject> object = JSONObject::create();
25 object->setNumber("x", point.x()); 26 object->setNumber("x", point.x());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 { 104 {
104 FloatQuad result; 105 FloatQuad result;
105 result.setP1(projection(projectOn.p1(), orthogonals.p1(), translatePoint(ori gin.p1(), orthogonals.p1(), distance))); 106 result.setP1(projection(projectOn.p1(), orthogonals.p1(), translatePoint(ori gin.p1(), orthogonals.p1(), distance)));
106 result.setP2(projection(projectOn.p2(), orthogonals.p2(), translatePoint(ori gin.p2(), orthogonals.p2(), distance))); 107 result.setP2(projection(projectOn.p2(), orthogonals.p2(), translatePoint(ori gin.p2(), orthogonals.p2(), distance)));
107 // We want to translate at top and bottom point in the same direction, so we use p1 here. 108 // We want to translate at top and bottom point in the same direction, so we use p1 here.
108 result.setP3(projection(projectOn.p3(), orthogonals.p3(), translatePoint(ori gin.p3(), orthogonals.p1(), distance))); 109 result.setP3(projection(projectOn.p3(), orthogonals.p3(), translatePoint(ori gin.p3(), orthogonals.p1(), distance)));
109 result.setP4(projection(projectOn.p4(), orthogonals.p4(), translatePoint(ori gin.p4(), orthogonals.p2(), distance))); 110 result.setP4(projection(projectOn.p4(), orthogonals.p4(), translatePoint(ori gin.p4(), orthogonals.p2(), distance)));
110 return result; 111 return result;
111 } 112 }
112 113
114 bool isMutableUnitType(CSSPrimitiveValue::UnitType unitType)
115 {
116 return unitType == CSSPrimitiveValue::UnitType::Pixels || unitType == CSSPri mitiveValue::UnitType::Ems || unitType == CSSPrimitiveValue::UnitType::Percentag e || unitType == CSSPrimitiveValue::UnitType::Rems;
117 }
118
113 } // namespace 119 } // namespace
114 120
115 LayoutEditor::LayoutEditor(InspectorCSSAgent* cssAgent) 121 LayoutEditor::LayoutEditor(InspectorCSSAgent* cssAgent)
116 : m_element(nullptr) 122 : m_element(nullptr)
117 , m_cssAgent(cssAgent) 123 , m_cssAgent(cssAgent)
118 , m_changingProperty(CSSPropertyInvalid) 124 , m_changingProperty(CSSPropertyInvalid)
119 , m_propertyInitialValue(0) 125 , m_propertyInitialValue(0)
120 { 126 {
121 } 127 }
122 128
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 } 182 }
177 183
178 PassRefPtr<JSONObject> LayoutEditor::createValueDescription(const String& proper tyName) const 184 PassRefPtr<JSONObject> LayoutEditor::createValueDescription(const String& proper tyName) const
179 { 185 {
180 RefPtrWillBeRawPtr<CSSPrimitiveValue> cssValue = getPropertyCSSValue(cssProp ertyID(propertyName)); 186 RefPtrWillBeRawPtr<CSSPrimitiveValue> cssValue = getPropertyCSSValue(cssProp ertyID(propertyName));
181 if (cssValue && !(cssValue->isLength() || cssValue->isPercentage())) 187 if (cssValue && !(cssValue->isLength() || cssValue->isPercentage()))
182 return nullptr; 188 return nullptr;
183 189
184 RefPtr<JSONObject> object = JSONObject::create(); 190 RefPtr<JSONObject> object = JSONObject::create();
185 object->setNumber("value", cssValue ? cssValue->getFloatValue() : 0); 191 object->setNumber("value", cssValue ? cssValue->getFloatValue() : 0);
186 object->setString("unit", CSSPrimitiveValue::unitTypeToString(cssValue ? css Value->typeWithCalcResolved() : CSSPrimitiveValue::UnitType::Pixels)); 192 CSSPrimitiveValue::UnitType unitType = cssValue ? cssValue->typeWithCalcReso lved() : CSSPrimitiveValue::UnitType::Pixels;
193 object->setString("unit", CSSPrimitiveValue::unitTypeToString(unitType));
187 // TODO: Support an editing of other popular units like: em, rem 194 // TODO: Support an editing of other popular units like: em, rem
188 object->setBoolean("mutable", !cssValue || cssValue->isPx()); 195 object->setBoolean("mutable", isMutableUnitType(unitType));
189 return object.release(); 196 return object.release();
190 } 197 }
191 198
192 void LayoutEditor::appendAnchorFor(JSONArray* anchors, const String& type, const String& propertyName, const FloatPoint& position, const FloatPoint& orthogonalV ector) const 199 void LayoutEditor::appendAnchorFor(JSONArray* anchors, const String& type, const String& propertyName, const FloatPoint& position, const FloatPoint& orthogonalV ector) const
193 { 200 {
194 RefPtr<JSONObject> description = createValueDescription(propertyName); 201 RefPtr<JSONObject> description = createValueDescription(propertyName);
195 if (description) 202 if (description)
196 anchors->pushObject(createAnchor(position, type, propertyName, orthogona lVector, description.release())); 203 anchors->pushObject(createAnchor(position, type, propertyName, orthogona lVector, description.release()));
197 } 204 }
198 205
199 void LayoutEditor::overlayStartedPropertyChange(const String& anchorName) 206 void LayoutEditor::overlayStartedPropertyChange(const String& anchorName)
200 { 207 {
201 m_changingProperty = cssPropertyID(anchorName); 208 m_changingProperty = cssPropertyID(anchorName);
202 if (!m_element || !m_changingProperty) 209 if (!m_element || !m_changingProperty)
203 return; 210 return;
204 211
205 RefPtrWillBeRawPtr<CSSPrimitiveValue> cssValue = getPropertyCSSValue(m_chang ingProperty); 212 RefPtrWillBeRawPtr<CSSPrimitiveValue> cssValue = getPropertyCSSValue(m_chang ingProperty);
206 if (cssValue && !cssValue->isPx()) 213 m_valueUnitType = cssValue ? cssValue->typeWithCalcResolved() : CSSPrimitive Value::UnitType::Pixels;
214 if (!isMutableUnitType(m_valueUnitType))
207 return; 215 return;
208 216
217 switch (m_valueUnitType) {
218 case CSSPrimitiveValue::UnitType::Pixels:
219 m_factor = 1;
220 break;
221 case CSSPrimitiveValue::UnitType::Ems:
222 m_factor = m_element->computedStyle()->computedFontSize();
223 break;
224 case CSSPrimitiveValue::UnitType::Percentage:
225 // It is hard to correctly support percentages, so we decided hack it th is way: 100% = 1000px
226 m_factor = 10;
dgozman 2015/08/15 00:33:47 Let's try with offsetParent.
sergeyv 2015/08/17 23:52:18 OffsetParent isn't the parent against which the wi
227 break;
228 case CSSPrimitiveValue::UnitType::Rems:
229 m_factor = m_element->document().computedStyle()->computedFontSize();
230 break;
231 default:
232 ASSERT_NOT_REACHED();
233 break;
234 }
209 m_propertyInitialValue = cssValue ? cssValue->getFloatValue() : 0; 235 m_propertyInitialValue = cssValue ? cssValue->getFloatValue() : 0;
210 } 236 }
211 237
212 void LayoutEditor::overlayPropertyChanged(float cssDelta) 238 void LayoutEditor::overlayPropertyChanged(float cssDelta)
213 { 239 {
214 if (m_changingProperty) { 240 if (m_changingProperty) {
dgozman 2015/08/15 00:33:47 && m_factor
sergeyv 2015/08/17 23:52:18 Done.
215 String errorString; 241 String errorString;
216 m_cssAgent->setCSSPropertyValue(&errorString, m_element.get(), m_changin gProperty, String::number(cssDelta + m_propertyInitialValue) + "px"); 242 m_cssAgent->setCSSPropertyValue(&errorString, m_element.get(), m_changin gProperty, String::format("%.2f", cssDelta / m_factor + m_propertyInitialValue) + CSSPrimitiveValue::unitTypeToString(m_valueUnitType));
217 } 243 }
218 } 244 }
219 245
220 void LayoutEditor::overlayEndedPropertyChange() 246 void LayoutEditor::overlayEndedPropertyChange()
221 { 247 {
222 m_changingProperty = CSSPropertyInvalid; 248 m_changingProperty = CSSPropertyInvalid;
223 m_propertyInitialValue = 0; 249 m_propertyInitialValue = 0;
250 m_factor = 0;
251 m_valueUnitType = CSSPrimitiveValue::UnitType::Unknown;
224 } 252 }
225 253
226 } // namespace blink 254 } // namespace blink
OLDNEW
« 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