Title: [223336] trunk
Revision
223336
Author
[email protected]
Date
2017-10-15 23:25:54 -0700 (Sun, 15 Oct 2017)

Log Message

Web Inspector: Modify CSS number values with up key and down key
https://bugs.webkit.org/show_bug.cgi?id=170779
<rdar://problem/33170633>

Reviewed by Matt Baker.

Source/WebInspectorUI:

Up key increments a number, Down key decrements it.

Holding modifier keys changes the step value:
- Option modifies the value by 0.1
- Shift modifies the value by 10
- Command modifies the value by 100

* UserInterface/Test.html:
* UserInterface/Views/EditingSupport.js:
(WI.incrementElementValue):
Abstract away incrementElementValue into a public method.

* UserInterface/Views/SpreadsheetTextField.js:
(WI.SpreadsheetTextField.prototype._handleKeyDown):

LayoutTests:

Add tests for WI.incrementElementValue defined in WebInspectorUI/UserInterface/Views/EditingSupport.js.

* inspector/unit-tests/editing-support-expected.txt: Added.
* inspector/unit-tests/editing-support.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (223335 => 223336)


--- trunk/LayoutTests/ChangeLog	2017-10-16 04:46:21 UTC (rev 223335)
+++ trunk/LayoutTests/ChangeLog	2017-10-16 06:25:54 UTC (rev 223336)
@@ -1,3 +1,16 @@
+2017-10-15  Nikita Vasilyev  <[email protected]>
+
+        Web Inspector: Modify CSS number values with up key and down key
+        https://bugs.webkit.org/show_bug.cgi?id=170779
+        <rdar://problem/33170633>
+
+        Reviewed by Matt Baker.
+
+        Add tests for WI.incrementElementValue defined in WebInspectorUI/UserInterface/Views/EditingSupport.js.
+
+        * inspector/unit-tests/editing-support-expected.txt: Added.
+        * inspector/unit-tests/editing-support.html: Added.
+
 2017-10-14  Antoine Quint  <[email protected]>
 
         Remove all Web Animations code

Added: trunk/LayoutTests/inspector/unit-tests/editing-support-expected.txt (0 => 223336)


--- trunk/LayoutTests/inspector/unit-tests/editing-support-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/inspector/unit-tests/editing-support-expected.txt	2017-10-16 06:25:54 UTC (rev 223336)
@@ -0,0 +1,13 @@
+Testing that WI.incrementElementValue works for numeric values.
+
+
+== Running test suite: WI.incrementElementValue
+-- Running test case: incrementElementValue.numeric
+PASS: Should increment by 0.1.
+PASS: Should decrement by 1.
+PASS: Should increment by 10.
+PASS: Should decrement by 100.
+
+-- Running test case: incrementElementValue.nonNumeric
+PASS: Text should not change.
+

Added: trunk/LayoutTests/inspector/unit-tests/editing-support.html (0 => 223336)


--- trunk/LayoutTests/inspector/unit-tests/editing-support.html	                        (rev 0)
+++ trunk/LayoutTests/inspector/unit-tests/editing-support.html	2017-10-16 06:25:54 UTC (rev 223336)
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script>
+function test() {
+    let suite = InspectorTest.createAsyncSuite("WI.incrementElementValue");
+
+    suite.addTestCase({
+        name: "incrementElementValue.numeric",
+        description: "Ensure that WI.incrementElementValue increments and decrements a numeric value.",
+        test(resolve, reject) {
+            let span = document.createElement("span");
+            span.contentEditable = true;
+            span.textContent = "font-size: 10px;";
+            document.body.append(span);
+
+            let selection = window.getSelection();
+            let textNode = span.firstChild;
+            selection.setBaseAndExtent(textNode, "font-size: ".length, textNode, "font-size: 10px".length);
+
+            WI.incrementElementValue(span, 0.1);
+            InspectorTest.expectEqual(span.textContent, "font-size: 10.1px;", `Should increment by 0.1.`);
+
+            WI.incrementElementValue(span, -1);
+            InspectorTest.expectEqual(span.textContent, "font-size: 9.1px;", `Should decrement by 1.`);
+
+            WI.incrementElementValue(span, 10);
+            InspectorTest.expectEqual(span.textContent, "font-size: 19.1px;", `Should increment by 10.`);
+
+            WI.incrementElementValue(span, -100);
+            InspectorTest.expectEqual(span.textContent, "font-size: -80.9px;", `Should decrement by 100.`);
+
+            resolve();
+        }
+    });
+
+    suite.addTestCase({
+        name: "incrementElementValue.nonNumeric",
+        description: "Ensure that WI.incrementElementValue does not change non-numeric values.",
+        test(resolve, reject) {
+            let span = document.createElement("span");
+            span.contentEditable = true;
+            span.textContent = "background-color";
+            document.body.append(span);
+
+            let selection = window.getSelection();
+            let textNode = span.firstChild;
+            selection.setBaseAndExtent(textNode, "background".length, textNode, "background-".length);
+
+            WI.incrementElementValue(span, 1);
+            InspectorTest.expectEqual(span.textContent, "background-color", `Text should not change.`);
+
+            resolve();
+        }
+    });
+
+    suite.runTestCasesAndFinish();
+}
+</script>
+</head>
+<body _onload_="runTest()">
+    <p>Testing that WI.incrementElementValue works for numeric values.</p>
+</body>
+</html>

Modified: trunk/Source/WebInspectorUI/ChangeLog (223335 => 223336)


--- trunk/Source/WebInspectorUI/ChangeLog	2017-10-16 04:46:21 UTC (rev 223335)
+++ trunk/Source/WebInspectorUI/ChangeLog	2017-10-16 06:25:54 UTC (rev 223336)
@@ -1,3 +1,26 @@
+2017-10-15  Nikita Vasilyev  <[email protected]>
+
+        Web Inspector: Modify CSS number values with up key and down key
+        https://bugs.webkit.org/show_bug.cgi?id=170779
+        <rdar://problem/33170633>
+
+        Reviewed by Matt Baker.
+
+        Up key increments a number, Down key decrements it.
+
+        Holding modifier keys changes the step value:
+        - Option modifies the value by 0.1
+        - Shift modifies the value by 10
+        - Command modifies the value by 100
+
+        * UserInterface/Test.html:
+        * UserInterface/Views/EditingSupport.js:
+        (WI.incrementElementValue):
+        Abstract away incrementElementValue into a public method.
+
+        * UserInterface/Views/SpreadsheetTextField.js:
+        (WI.SpreadsheetTextField.prototype._handleKeyDown):
+
 2017-10-15  Devin Rousso  <[email protected]>
 
         Web Inspector: show warning when recorded Canvas action caused no visual change

Modified: trunk/Source/WebInspectorUI/UserInterface/Test.html (223335 => 223336)


--- trunk/Source/WebInspectorUI/UserInterface/Test.html	2017-10-16 04:46:21 UTC (rev 223335)
+++ trunk/Source/WebInspectorUI/UserInterface/Test.html	2017-10-16 06:25:54 UTC (rev 223336)
@@ -216,6 +216,7 @@
     <script src=""
     <script src=""
     <script src=""
+    <script src=""
     <script src=""
 
     <script type="text/_javascript_">

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/EditingSupport.js (223335 => 223336)


--- trunk/Source/WebInspectorUI/UserInterface/Views/EditingSupport.js	2017-10-16 04:46:21 UTC (rev 223335)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/EditingSupport.js	2017-10-16 06:25:54 UTC (rev 223336)
@@ -228,73 +228,19 @@
                 blurEventListener();
         } else if (result && result.startsWith("modify-")) {
             let direction = result.substring(7);
-            let modifyValue = direction.startsWith("up") ? 1 : -1;
+            let delta = direction.startsWith("up") ? 1 : -1;
             if (direction.endsWith("big"))
-                modifyValue *= 10;
+                delta *= 10;
 
             if (event.shiftKey)
-                modifyValue *= 10;
+                delta *= 10;
             else if (event.ctrlKey)
-                modifyValue /= 10;
+                delta /= 10;
 
-            let selection = element.ownerDocument.defaultView.getSelection();
-            if (!selection.rangeCount)
+            let modified = WI.incrementElementValue(element, delta);
+            if (!modified)
                 return;
 
-            let range = selection.getRangeAt(0);
-            if (!range.commonAncestorContainer.isSelfOrDescendant(element))
-                return false;
-
-            let wordRange = range.startContainer.rangeOfWord(range.startOffset, WI.EditingSupport.StyleValueDelimiters, element);
-            let word = wordRange.toString();
-            let wordPrefix = "";
-            let wordSuffix = "";
-            let nonNumberInWord = /[^\d-\.]+/.exec(word);
-            if (nonNumberInWord) {
-                let nonNumberEndOffset = nonNumberInWord.index + nonNumberInWord[0].length;
-                if (range.startOffset > wordRange.startOffset + nonNumberInWord.index && nonNumberEndOffset < word.length && range.startOffset !== wordRange.startOffset) {
-                    wordPrefix = word.substring(0, nonNumberEndOffset);
-                    word = word.substring(nonNumberEndOffset);
-                } else {
-                    wordSuffix = word.substring(nonNumberInWord.index);
-                    word = word.substring(0, nonNumberInWord.index);
-                }
-            }
-
-            let matches = WI.EditingSupport.CSSNumberRegex.exec(word);
-            if (!matches || matches.length !== 4)
-                return;
-
-            let replacement = matches[1] + (Math.round((parseFloat(matches[2]) + modifyValue) * 100) / 100) + matches[3];
-
-            selection.removeAllRanges();
-            selection.addRange(wordRange);
-            document.execCommand("insertText", false, wordPrefix + replacement + wordSuffix);
-
-            let container = range.commonAncestorContainer;
-            let startOffset = range.startOffset;
-            // This check is for the situation when the cursor is in the space between the
-            // opening quote of the attribute and the first character. In that spot, the
-            // commonAncestorContainer is actually the entire attribute node since `="` is
-            // added as a simple text node. Since the opening quote is immediately before
-            // the attribute, the node for that attribute must be the next sibling and the
-            // text of the attribute's value must be the first child of that sibling.
-            if (container.parentNode.classList.contains("editing")) {
-                container = container.nextSibling.firstChild;
-                startOffset = 0;
-            }
-            startOffset += wordPrefix.length;
-
-            if (!container)
-                return;
-
-            let replacementSelectionRange = document.createRange();
-            replacementSelectionRange.setStart(container, startOffset);
-            replacementSelectionRange.setEnd(container, startOffset + replacement.length);
-
-            selection.removeAllRanges();
-            selection.addRange(replacementSelectionRange);
-
             if (typeof config.numberCommitHandler === "function")
                 config.numberCommitHandler(element, getContent(element), oldText, context, moveDirection);
 
@@ -328,6 +274,69 @@
     };
 };
 
+WI.incrementElementValue = function(element, delta)
+{
+    let selection = element.ownerDocument.defaultView.getSelection();
+    if (!selection.rangeCount)
+        return false;
+
+    let range = selection.getRangeAt(0);
+    if (!range.commonAncestorContainer.isSelfOrDescendant(element))
+        return false;
+
+    let wordRange = range.startContainer.rangeOfWord(range.startOffset, WI.EditingSupport.StyleValueDelimiters, element);
+    let word = wordRange.toString();
+    let wordPrefix = "";
+    let wordSuffix = "";
+    let nonNumberInWord = /[^\d-\.]+/.exec(word);
+    if (nonNumberInWord) {
+        let nonNumberEndOffset = nonNumberInWord.index + nonNumberInWord[0].length;
+        if (range.startOffset > wordRange.startOffset + nonNumberInWord.index && nonNumberEndOffset < word.length && range.startOffset !== wordRange.startOffset) {
+            wordPrefix = word.substring(0, nonNumberEndOffset);
+            word = word.substring(nonNumberEndOffset);
+        } else {
+            wordSuffix = word.substring(nonNumberInWord.index);
+            word = word.substring(0, nonNumberInWord.index);
+        }
+    }
+
+    let matches = WI.EditingSupport.CSSNumberRegex.exec(word);
+    if (!matches || matches.length !== 4)
+        return false;
+
+    let replacement = matches[1] + (Math.round((parseFloat(matches[2]) + delta) * 100) / 100) + matches[3];
+
+    selection.removeAllRanges();
+    selection.addRange(wordRange);
+    document.execCommand("insertText", false, wordPrefix + replacement + wordSuffix);
+
+    let container = range.commonAncestorContainer;
+    let startOffset = range.startOffset;
+    // This check is for the situation when the cursor is in the space between the
+    // opening quote of the attribute and the first character. In that spot, the
+    // commonAncestorContainer is actually the entire attribute node since `="` is
+    // added as a simple text node. Since the opening quote is immediately before
+    // the attribute, the node for that attribute must be the next sibling and the
+    // text of the attribute's value must be the first child of that sibling.
+    if (container.parentNode.classList.contains("editing") && container.nextSibling) {
+        container = container.nextSibling.firstChild;
+        startOffset = 0;
+    }
+    startOffset += wordPrefix.length;
+
+    if (!container)
+        return false;
+
+    let replacementSelectionRange = document.createRange();
+    replacementSelectionRange.setStart(container, startOffset);
+    replacementSelectionRange.setEnd(container, startOffset + replacement.length);
+
+    selection.removeAllRanges();
+    selection.addRange(replacementSelectionRange);
+
+    return true;
+};
+
 WI.EditingSupport = {
     StyleValueDelimiters: " \xA0\t\n\"':;,/()",
     CSSNumberRegex: /(.*?)(-?(?:\d+(?:\.\d+)?|\.\d+))(.*)/,

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SpreadsheetTextField.js (223335 => 223336)


--- trunk/Source/WebInspectorUI/UserInterface/Views/SpreadsheetTextField.js	2017-10-16 04:46:21 UTC (rev 223335)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SpreadsheetTextField.js	2017-10-16 06:25:54 UTC (rev 223336)
@@ -225,6 +225,28 @@
             return;
         }
 
+        if (event.key === "ArrowUp" || event.key === "ArrowDown") {
+            let delta = 1;
+            if (event.metaKey)
+                delta = 100;
+            else if (event.shiftKey)
+                delta = 10;
+            else if (event.altKey)
+                delta = 0.1;
+
+            if (event.key === "ArrowDown")
+                delta = -delta;
+
+            let didModify = WI.incrementElementValue(this._element, delta);
+            if (!didModify)
+                return;
+
+            event.stop();
+
+            if (this._delegate && typeof this._delegate.spreadsheetTextFieldDidChange === "function")
+                this._delegate.spreadsheetTextFieldDidChange(this);
+        }
+
         if (event.key === "Escape") {
             event.stop();
             this._discardChange();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to