Title: [259744] trunk
Revision
259744
Author
[email protected]
Date
2020-04-08 12:16:34 -0700 (Wed, 08 Apr 2020)

Log Message

Web Inspector: Storage: cannot clear out multiple or all local storage entries
https://bugs.webkit.org/show_bug.cgi?id=209867

Reviewed by Timothy Hatcher.

Source/_javascript_Core:

* inspector/protocol/DOMStorage.json:
Add a `clearDOMStorageItems` command instead of calling `removeDOMStorageItem` for each key.

Source/WebCore:

Tests: inspector/storage/clearDOMStorageItems.html
       inspector/storage/getDOMStorageItems.html
       inspector/storage/removeDOMStorageItem.html
       inspector/storage/setDOMStorageItem.html

* inspector/agents/InspectorDOMStorageAgent.h:
* inspector/agents/InspectorDOMStorageAgent.cpp:
(WebCore::InspectorDOMStorageAgent::clearDOMStorageItems): Added.
Add a `clearDOMStorageItems` command instead of calling `removeDOMStorageItem` for each key.

Source/WebInspectorUI:

* UserInterface/Models/DOMStorageObject.js:
(WI.DOMStorageObject.prototype.removeItem):
(WI.DOMStorageObject.prototype.setItem):
(WI.DOMStorageObject.prototype.clear): Added.
(WI.DOMStorageObject.prototype.itemsCleared):
(WI.DOMStorageObject.prototype.itemRemoved):
(WI.DOMStorageObject.prototype.itemAdded):
(WI.DOMStorageObject.prototype.itemUpdated):
Add some assertions.

* UserInterface/Views/DOMStorageContentView.js:
(WI.DOMStorageContentView):
(WI.DOMStorageContentView.prototype.get navigationItems):
(WI.DOMStorageContentView.prototype._handleClearNavigationItemClicked): Added.
Add a "Clear" navigation item that calls the new `DOMStorage.clearDOMStorageItems`.

* UserInterface/Views/DataGrid.js:
(WI.DataGrid.prototype.removeChild):
If the removed item was selected, select the next (or previous if there is no next) item.

* UserInterface/Views/CookieStorageContentView.js:
(WI.CookieStorageContentView):
(WI.CookieStorageContentView.prototype.get navigationItems):
(WI.CookieStorageContentView.prototype._handleClearNavigationItemClicked): Added.
Drive-by: also add a "Clear" navigation item that calls `Page.deleteCookie` for each row.

* UserInterface/Protocol/DOMStorageObserver.js:
(WI.DOMStorageObserver.prototype.domStorageItemUpdated):
* UserInterface/Controllers/DOMStorageManager.js:
(WI.DOMStorageManager.prototype.itemUpdated):
Drive-by: rename `value` to `newValue` to match the protocol.

* Localizations/en.lproj/localizedStrings.js:

LayoutTests:

* inspector/storage/clearDOMStorageItems.html: Added.
* inspector/storage/clearDOMStorageItems-expected.txt: Added.
* inspector/storage/domStorage-events.html:
* inspector/storage/domStorage-events-expected.txt:
* inspector/storage/getDOMStorageItems.html: Added.
* inspector/storage/getDOMStorageItems-expected.txt: Added.
* inspector/storage/removeDOMStorageItem.html: Added.
* inspector/storage/removeDOMStorageItem-expected.txt: Added.
* inspector/storage/setDOMStorageItem.html: Added.
* inspector/storage/setDOMStorageItem-expected.txt: Added.
* inspector/storage/resources/storage-utilities.js: Added.
(clearStorages):
(TestPage.registerInitializer.InspectorTest.Storage.async logEntries):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (259743 => 259744)


--- trunk/LayoutTests/ChangeLog	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/LayoutTests/ChangeLog	2020-04-08 19:16:34 UTC (rev 259744)
@@ -1,3 +1,24 @@
+2020-04-08  Devin Rousso  <[email protected]>
+
+        Web Inspector: Storage: cannot clear out multiple or all local storage entries
+        https://bugs.webkit.org/show_bug.cgi?id=209867
+
+        Reviewed by Timothy Hatcher.
+
+        * inspector/storage/clearDOMStorageItems.html: Added.
+        * inspector/storage/clearDOMStorageItems-expected.txt: Added.
+        * inspector/storage/domStorage-events.html:
+        * inspector/storage/domStorage-events-expected.txt:
+        * inspector/storage/getDOMStorageItems.html: Added.
+        * inspector/storage/getDOMStorageItems-expected.txt: Added.
+        * inspector/storage/removeDOMStorageItem.html: Added.
+        * inspector/storage/removeDOMStorageItem-expected.txt: Added.
+        * inspector/storage/setDOMStorageItem.html: Added.
+        * inspector/storage/setDOMStorageItem-expected.txt: Added.
+        * inspector/storage/resources/storage-utilities.js: Added.
+        (clearStorages):
+        (TestPage.registerInitializer.InspectorTest.Storage.async logEntries):
+
 2020-04-08  Diego Pino Garcia  <[email protected]>
 
         [GTK] Gardening, update TestExpectations after r259712

Added: trunk/LayoutTests/inspector/storage/clearDOMStorageItems-expected.txt (0 => 259744)


--- trunk/LayoutTests/inspector/storage/clearDOMStorageItems-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/inspector/storage/clearDOMStorageItems-expected.txt	2020-04-08 19:16:34 UTC (rev 259744)
@@ -0,0 +1,38 @@
+Tests for DOMStorage.clearDOMStorageItems.
+
+
+== Running test suite: DOMStorage.clearDOMStorageItems
+-- Running test case: DOMStorage.clearDOMStorageItems.Session
+PASS: Should have a DOMStorageObject for sessionStorage.
+
+Getting DOM storage entries...
+[
+  [
+    "foo",
+    "bar"
+  ]
+]
+
+Clearing storage...
+
+Getting DOM storage entries...
+[]
+
+
+-- Running test case: DOMStorage.clearDOMStorageItems.Local
+PASS: Should have a DOMStorageObject for localStorage.
+
+Getting DOM storage entries...
+[
+  [
+    "foo",
+    "bar"
+  ]
+]
+
+Clearing storage...
+
+Getting DOM storage entries...
+[]
+
+

Added: trunk/LayoutTests/inspector/storage/clearDOMStorageItems.html (0 => 259744)


--- trunk/LayoutTests/inspector/storage/clearDOMStorageItems.html	                        (rev 0)
+++ trunk/LayoutTests/inspector/storage/clearDOMStorageItems.html	2020-04-08 19:16:34 UTC (rev 259744)
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script src=""
+<script>
+function test()
+{
+    let suite = InspectorTest.createAsyncSuite("DOMStorage.clearDOMStorageItems");
+
+    suite.addTestCase({
+        name: "DOMStorage.clearDOMStorageItems.Session",
+        description: "Test that DOMStorage.clearDOMStorageItems works with Session storage.",
+        async test() {
+            let sessionStorage = WI.domStorageManager.domStorageObjects.find((x) => !x.isLocalStorage());
+            InspectorTest.expectThat(sessionStorage, "Should have a DOMStorageObject for sessionStorage.");
+
+            await InspectorTest.Storage.logEntries(sessionStorage);
+
+            InspectorTest.log("Clearing storage...");
+            await sessionStorage.clear();
+
+            await InspectorTest.Storage.logEntries(sessionStorage);
+        },
+    });
+
+    suite.addTestCase({
+        name: "DOMStorage.clearDOMStorageItems.Local",
+        description: "Test that DOMStorage.clearDOMStorageItems works with Local storage.",
+        async test() {
+            let localStorage = WI.domStorageManager.domStorageObjects.find((x) => x.isLocalStorage());
+            InspectorTest.expectThat(localStorage, "Should have a DOMStorageObject for localStorage.");
+
+            await InspectorTest.Storage.logEntries(localStorage);
+
+            InspectorTest.log("Clearing storage...");
+            await localStorage.clear();
+
+            await InspectorTest.Storage.logEntries(localStorage);
+        },
+    });
+
+    InspectorTest.evaluateInPage("clearStorages()", () => {
+        suite.runTestCasesAndFinish();
+    });
+}
+</script>
+</head>
+<body _onload_="runTest()">
+<p>Tests for DOMStorage.clearDOMStorageItems.</p>
+</body>
+</html>

Modified: trunk/LayoutTests/inspector/storage/domStorage-events-expected.txt (259743 => 259744)


--- trunk/LayoutTests/inspector/storage/domStorage-events-expected.txt	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/LayoutTests/inspector/storage/domStorage-events-expected.txt	2020-04-08 19:16:34 UTC (rev 259744)
@@ -13,7 +13,7 @@
 PASS: WI.DOMStorageObject.Event.ItemUpdated
 PASS: Should update key 'x'.
 PASS: Should have oldValue 'value1'.
-PASS: Should have new value 'value2'.
+PASS: Should have newValue 'value2'.
 PASS: WI.DOMStorageObject.Event.ItemRemoved
 PASS: Should remove key 'x'.
 PASS: WI.DOMStorageObject.Event.ItemsCleared
@@ -29,7 +29,7 @@
 PASS: WI.DOMStorageObject.Event.ItemUpdated
 PASS: Should update key 'x'.
 PASS: Should have oldValue 'value1'.
-PASS: Should have new value 'value2'.
+PASS: Should have newValue 'value2'.
 PASS: WI.DOMStorageObject.Event.ItemRemoved
 PASS: Should remove key 'x'.
 PASS: WI.DOMStorageObject.Event.ItemsCleared

Modified: trunk/LayoutTests/inspector/storage/domStorage-events.html (259743 => 259744)


--- trunk/LayoutTests/inspector/storage/domStorage-events.html	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/LayoutTests/inspector/storage/domStorage-events.html	2020-04-08 19:16:34 UTC (rev 259744)
@@ -25,15 +25,15 @@
 
             if (count === 1) {
                 InspectorTest.pass("WI.DOMStorageObject.Event.ItemAdded");
-                InspectorTest.expectThat(event.data.key === "foo", "Should add key 'foo'.");
-                InspectorTest.expectThat(event.data.value === "value1", "Should have value 'value1'.");
+                InspectorTest.expectEqual(event.data.key, "foo", "Should add key 'foo'.");
+                InspectorTest.expectEqual(event.data.value, "value1", "Should have value 'value1'.");
                 return;
             }
 
             if (count === 2) {
                 InspectorTest.pass("WI.DOMStorageObject.Event.ItemAdded");
-                InspectorTest.expectThat(event.data.key === "x", "Should add key 'x'.");
-                InspectorTest.expectThat(event.data.value === "xvalue", "Should have value 'xvalue'.");
+                InspectorTest.expectEqual(event.data.key, "x", "Should add key 'x'.");
+                InspectorTest.expectEqual(event.data.value, "xvalue", "Should have value 'xvalue'.");
                 return;
             }
 
@@ -43,15 +43,15 @@
         storageObject.awaitEvent(WI.DOMStorageObject.Event.ItemRemoved)
         .then((event) => {
             InspectorTest.pass("WI.DOMStorageObject.Event.ItemRemoved");
-            InspectorTest.expectThat(event.data.key === "foo", "Should remove key 'x'.");
+            InspectorTest.expectEqual(event.data.key, "foo", "Should remove key 'x'.");
         });
 
         storageObject.awaitEvent(WI.DOMStorageObject.Event.ItemUpdated)
         .then((event) => {
             InspectorTest.pass("WI.DOMStorageObject.Event.ItemUpdated");
-            InspectorTest.expectThat(event.data.key === "foo", "Should update key 'x'.");
-            InspectorTest.expectThat(event.data.oldValue === "value1", "Should have oldValue 'value1'.");
-            InspectorTest.expectThat(event.data.value === "value2", "Should have new value 'value2'.");
+            InspectorTest.expectEqual(event.data.key, "foo", "Should update key 'x'.");
+            InspectorTest.expectEqual(event.data.oldValue, "value1", "Should have oldValue 'value1'.");
+            InspectorTest.expectEqual(event.data.newValue, "value2", "Should have newValue 'value2'.");
         });
 
         storageObject.awaitEvent(WI.DOMStorageObject.Event.ItemsCleared)

Added: trunk/LayoutTests/inspector/storage/getDOMStorageItems-expected.txt (0 => 259744)


--- trunk/LayoutTests/inspector/storage/getDOMStorageItems-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/inspector/storage/getDOMStorageItems-expected.txt	2020-04-08 19:16:34 UTC (rev 259744)
@@ -0,0 +1,28 @@
+Tests for DOMStorage.getDOMStorageItems.
+
+
+== Running test suite: DOMStorage.getDOMStorageItems
+-- Running test case: DOMStorage.getDOMStorageItems.Session
+PASS: Should have a DOMStorageObject for sessionStorage.
+
+Getting DOM storage entries...
+[
+  [
+    "foo",
+    "bar"
+  ]
+]
+
+
+-- Running test case: DOMStorage.getDOMStorageItems.Local
+PASS: Should have a DOMStorageObject for localStorage.
+
+Getting DOM storage entries...
+[
+  [
+    "foo",
+    "bar"
+  ]
+]
+
+

Added: trunk/LayoutTests/inspector/storage/getDOMStorageItems.html (0 => 259744)


--- trunk/LayoutTests/inspector/storage/getDOMStorageItems.html	                        (rev 0)
+++ trunk/LayoutTests/inspector/storage/getDOMStorageItems.html	2020-04-08 19:16:34 UTC (rev 259744)
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script src=""
+<script>
+function test()
+{
+    let suite = InspectorTest.createAsyncSuite("DOMStorage.getDOMStorageItems");
+
+    suite.addTestCase({
+        name: "DOMStorage.getDOMStorageItems.Session",
+        description: "Test that DOMStorage.getDOMStorageItems works with Session storage.",
+        async test() {
+            let sessionStorage = WI.domStorageManager.domStorageObjects.find((x) => !x.isLocalStorage());
+            InspectorTest.expectThat(sessionStorage, "Should have a DOMStorageObject for sessionStorage.");
+
+            await InspectorTest.Storage.logEntries(sessionStorage);
+        },
+    });
+
+    suite.addTestCase({
+        name: "DOMStorage.getDOMStorageItems.Local",
+        description: "Test that DOMStorage.getDOMStorageItems works with Local storage.",
+        async test() {
+            let localStorage = WI.domStorageManager.domStorageObjects.find((x) => x.isLocalStorage());
+            InspectorTest.expectThat(localStorage, "Should have a DOMStorageObject for localStorage.");
+
+            await InspectorTest.Storage.logEntries(localStorage);
+        },
+    });
+
+    InspectorTest.evaluateInPage("clearStorages()", () => {
+        suite.runTestCasesAndFinish();
+    });
+}
+</script>
+</head>
+<body _onload_="runTest()">
+<p>Tests for DOMStorage.getDOMStorageItems.</p>
+</body>
+</html>

Added: trunk/LayoutTests/inspector/storage/removeDOMStorageItem-expected.txt (0 => 259744)


--- trunk/LayoutTests/inspector/storage/removeDOMStorageItem-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/inspector/storage/removeDOMStorageItem-expected.txt	2020-04-08 19:16:34 UTC (rev 259744)
@@ -0,0 +1,38 @@
+Tests for DOMStorage.removeDOMStorageItem.
+
+
+== Running test suite: DOMStorage.removeDOMStorageItem
+-- Running test case: DOMStorage.removeDOMStorageItem.Session
+PASS: Should have a DOMStorageObject for sessionStorage.
+
+Getting DOM storage entries...
+[
+  [
+    "foo",
+    "bar"
+  ]
+]
+
+Removing 'foo'...
+
+Getting DOM storage entries...
+[]
+
+
+-- Running test case: DOMStorage.removeDOMStorageItem.Local
+PASS: Should have a DOMStorageObject for localStorage.
+
+Getting DOM storage entries...
+[
+  [
+    "foo",
+    "bar"
+  ]
+]
+
+Removing 'foo'...
+
+Getting DOM storage entries...
+[]
+
+

Added: trunk/LayoutTests/inspector/storage/removeDOMStorageItem.html (0 => 259744)


--- trunk/LayoutTests/inspector/storage/removeDOMStorageItem.html	                        (rev 0)
+++ trunk/LayoutTests/inspector/storage/removeDOMStorageItem.html	2020-04-08 19:16:34 UTC (rev 259744)
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script src=""
+<script>
+function test()
+{
+    let suite = InspectorTest.createAsyncSuite("DOMStorage.removeDOMStorageItem");
+
+    suite.addTestCase({
+        name: "DOMStorage.removeDOMStorageItem.Session",
+        description: "Test that DOMStorage.removeDOMStorageItem works with Session storage.",
+        async test() {
+            let sessionStorage = WI.domStorageManager.domStorageObjects.find((x) => !x.isLocalStorage());
+            InspectorTest.expectThat(sessionStorage, "Should have a DOMStorageObject for sessionStorage.");
+
+            await InspectorTest.Storage.logEntries(sessionStorage);
+
+            InspectorTest.log("Removing 'foo'...");
+            await sessionStorage.removeItem("foo");
+
+            await InspectorTest.Storage.logEntries(sessionStorage);
+        },
+    });
+
+    suite.addTestCase({
+        name: "DOMStorage.removeDOMStorageItem.Local",
+        description: "Test that DOMStorage.removeDOMStorageItem works with Local storage.",
+        async test() {
+            let localStorage = WI.domStorageManager.domStorageObjects.find((x) => x.isLocalStorage());
+            InspectorTest.expectThat(localStorage, "Should have a DOMStorageObject for localStorage.");
+
+            await InspectorTest.Storage.logEntries(localStorage);
+
+            InspectorTest.log("Removing 'foo'...");
+            await localStorage.removeItem("foo");
+
+            await InspectorTest.Storage.logEntries(localStorage);
+        },
+    });
+
+    InspectorTest.evaluateInPage("clearStorages()", () => {
+        suite.runTestCasesAndFinish();
+    });
+}
+</script>
+</head>
+<body _onload_="runTest()">
+<p>Tests for DOMStorage.removeDOMStorageItem.</p>
+</body>
+</html>

Added: trunk/LayoutTests/inspector/storage/resources/storage-utilities.js (0 => 259744)


--- trunk/LayoutTests/inspector/storage/resources/storage-utilities.js	                        (rev 0)
+++ trunk/LayoutTests/inspector/storage/resources/storage-utilities.js	2020-04-08 19:16:34 UTC (rev 259744)
@@ -0,0 +1,20 @@
+function clearStorages() {
+    sessionStorage.clear();
+    sessionStorage.setItem("foo", "bar");
+
+    localStorage.clear();
+    localStorage.setItem("foo", "bar");
+}
+
+TestPage.registerInitializer(() => {
+    InspectorTest.Storage = {};
+
+    InspectorTest.Storage.logEntries = async function(storage) {
+        InspectorTest.newline();
+        InspectorTest.log("Getting DOM storage entries...");
+        let [error, entries] = await promisify((callback) => { storage.getEntries(callback); });
+        InspectorTest.assert(!error, error);
+        InspectorTest.json(entries);
+        InspectorTest.newline();
+    };
+});

Added: trunk/LayoutTests/inspector/storage/setDOMStorageItem-expected.txt (0 => 259744)


--- trunk/LayoutTests/inspector/storage/setDOMStorageItem-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/inspector/storage/setDOMStorageItem-expected.txt	2020-04-08 19:16:34 UTC (rev 259744)
@@ -0,0 +1,56 @@
+Tests for DOMStorage.setDOMStorageItem.
+
+
+== Running test suite: DOMStorage.setDOMStorageItem
+-- Running test case: DOMStorage.setDOMStorageItem.Session
+PASS: Should have a DOMStorageObject for sessionStorage.
+
+Getting DOM storage entries...
+[
+  [
+    "foo",
+    "bar"
+  ]
+]
+
+Setting key 'asd' with value 'new'...
+
+Getting DOM storage entries...
+[
+  [
+    "foo",
+    "bar"
+  ],
+  [
+    "asd",
+    "new"
+  ]
+]
+
+
+-- Running test case: DOMStorage.setDOMStorageItem.Local
+PASS: Should have a DOMStorageObject for localStorage.
+
+Getting DOM storage entries...
+[
+  [
+    "foo",
+    "bar"
+  ]
+]
+
+Setting key 'asd' with value 'new'...
+
+Getting DOM storage entries...
+[
+  [
+    "foo",
+    "bar"
+  ],
+  [
+    "asd",
+    "new"
+  ]
+]
+
+

Added: trunk/LayoutTests/inspector/storage/setDOMStorageItem.html (0 => 259744)


--- trunk/LayoutTests/inspector/storage/setDOMStorageItem.html	                        (rev 0)
+++ trunk/LayoutTests/inspector/storage/setDOMStorageItem.html	2020-04-08 19:16:34 UTC (rev 259744)
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script src=""
+<script>
+function test()
+{
+    let suite = InspectorTest.createAsyncSuite("DOMStorage.setDOMStorageItem");
+
+    suite.addTestCase({
+        name: "DOMStorage.setDOMStorageItem.Session",
+        description: "Test that DOMStorage.setDOMStorageItem works with Session storage.",
+        async test() {
+            let sessionStorage = WI.domStorageManager.domStorageObjects.find((x) => !x.isLocalStorage());
+            InspectorTest.expectThat(sessionStorage, "Should have a DOMStorageObject for sessionStorage.");
+
+            await InspectorTest.Storage.logEntries(sessionStorage);
+
+            InspectorTest.log("Setting key 'asd' with value 'new'...");
+            await sessionStorage.setItem("asd", "new");
+
+            await InspectorTest.Storage.logEntries(sessionStorage);
+        },
+    });
+
+    suite.addTestCase({
+        name: "DOMStorage.setDOMStorageItem.Local",
+        description: "Test that DOMStorage.setDOMStorageItem works with Local storage.",
+        async test() {
+            let localStorage = WI.domStorageManager.domStorageObjects.find((x) => x.isLocalStorage());
+            InspectorTest.expectThat(localStorage, "Should have a DOMStorageObject for localStorage.");
+
+            await InspectorTest.Storage.logEntries(localStorage);
+
+            InspectorTest.log("Setting key 'asd' with value 'new'...");
+            await localStorage.setItem("asd", "new");
+
+            await InspectorTest.Storage.logEntries(localStorage);
+        },
+    });
+
+    InspectorTest.evaluateInPage("clearStorages()", () => {
+        suite.runTestCasesAndFinish();
+    });
+}
+</script>
+</head>
+<body _onload_="runTest()">
+<p>Tests for DOMStorage.setDOMStorageItem.</p>
+</body>
+</html>

Modified: trunk/Source/_javascript_Core/ChangeLog (259743 => 259744)


--- trunk/Source/_javascript_Core/ChangeLog	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/_javascript_Core/ChangeLog	2020-04-08 19:16:34 UTC (rev 259744)
@@ -1,3 +1,13 @@
+2020-04-08  Devin Rousso  <[email protected]>
+
+        Web Inspector: Storage: cannot clear out multiple or all local storage entries
+        https://bugs.webkit.org/show_bug.cgi?id=209867
+
+        Reviewed by Timothy Hatcher.
+
+        * inspector/protocol/DOMStorage.json:
+        Add a `clearDOMStorageItems` command instead of calling `removeDOMStorageItem` for each key.
+
 2020-04-08  Yusuke Suzuki  <[email protected]>
 
         [JSC] MultiDeleteByOffset should tell correct result AbstractValue in AI

Modified: trunk/Source/_javascript_Core/inspector/protocol/DOMStorage.json (259743 => 259744)


--- trunk/Source/_javascript_Core/inspector/protocol/DOMStorage.json	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/_javascript_Core/inspector/protocol/DOMStorage.json	2020-04-08 19:16:34 UTC (rev 259744)
@@ -52,6 +52,12 @@
                 { "name": "storageId", "$ref": "StorageId" },
                 { "name": "key", "type": "string" }
             ]
+        },
+        {
+            "name": "clearDOMStorageItems",
+            "parameters": [
+                { "name": "storageId", "$ref": "StorageId" }
+            ]
         }
     ],
     "events": [

Modified: trunk/Source/WebCore/ChangeLog (259743 => 259744)


--- trunk/Source/WebCore/ChangeLog	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebCore/ChangeLog	2020-04-08 19:16:34 UTC (rev 259744)
@@ -1,3 +1,20 @@
+2020-04-08  Devin Rousso  <[email protected]>
+
+        Web Inspector: Storage: cannot clear out multiple or all local storage entries
+        https://bugs.webkit.org/show_bug.cgi?id=209867
+
+        Reviewed by Timothy Hatcher.
+
+        Tests: inspector/storage/clearDOMStorageItems.html
+               inspector/storage/getDOMStorageItems.html
+               inspector/storage/removeDOMStorageItem.html
+               inspector/storage/setDOMStorageItem.html
+
+        * inspector/agents/InspectorDOMStorageAgent.h:
+        * inspector/agents/InspectorDOMStorageAgent.cpp:
+        (WebCore::InspectorDOMStorageAgent::clearDOMStorageItems): Added.
+        Add a `clearDOMStorageItems` command instead of calling `removeDOMStorageItem` for each key.
+
 2020-04-08  Kenneth Russell  <[email protected]>
 
         WebContent process crashes in com.apple.WebCore: rx::IOSurfaceSurfaceCGL::releaseTexImage

Modified: trunk/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.cpp (259743 => 259744)


--- trunk/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.cpp	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.cpp	2020-04-08 19:16:34 UTC (rev 259744)
@@ -145,6 +145,18 @@
     storageArea->removeItem(frame, key);
 }
 
+void InspectorDOMStorageAgent::clearDOMStorageItems(ErrorString& errorString, const JSON::Object& storageId)
+{
+    Frame* frame;
+    auto storageArea = findStorageArea(errorString, storageId, frame);
+    if (!storageArea) {
+        errorString = "Missing storage for given storageId"_s;
+        return;
+    }
+
+    storageArea->clear(frame);
+}
+
 String InspectorDOMStorageAgent::storageId(Storage& storage)
 {
     Document* document = storage.frame()->document();

Modified: trunk/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.h (259743 => 259744)


--- trunk/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.h	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.h	2020-04-08 19:16:34 UTC (rev 259744)
@@ -64,6 +64,7 @@
     void getDOMStorageItems(ErrorString&, const JSON::Object& storageId, RefPtr<JSON::ArrayOf<JSON::ArrayOf<String>>>& items) override;
     void setDOMStorageItem(ErrorString&, const JSON::Object& storageId, const String& key, const String& value) override;
     void removeDOMStorageItem(ErrorString&, const JSON::Object& storageId, const String& key) override;
+    void clearDOMStorageItems(ErrorString&, const JSON::Object& storageId) override;
 
     // InspectorInstrumentation
     void didDispatchDOMStorageEvent(const String& key, const String& oldValue, const String& newValue, StorageType, SecurityOrigin*);

Modified: trunk/Source/WebInspectorUI/ChangeLog (259743 => 259744)


--- trunk/Source/WebInspectorUI/ChangeLog	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebInspectorUI/ChangeLog	2020-04-08 19:16:34 UTC (rev 259744)
@@ -1,5 +1,46 @@
 2020-04-08  Devin Rousso  <[email protected]>
 
+        Web Inspector: Storage: cannot clear out multiple or all local storage entries
+        https://bugs.webkit.org/show_bug.cgi?id=209867
+
+        Reviewed by Timothy Hatcher.
+
+        * UserInterface/Models/DOMStorageObject.js:
+        (WI.DOMStorageObject.prototype.removeItem):
+        (WI.DOMStorageObject.prototype.setItem):
+        (WI.DOMStorageObject.prototype.clear): Added.
+        (WI.DOMStorageObject.prototype.itemsCleared):
+        (WI.DOMStorageObject.prototype.itemRemoved):
+        (WI.DOMStorageObject.prototype.itemAdded):
+        (WI.DOMStorageObject.prototype.itemUpdated):
+        Add some assertions.
+
+        * UserInterface/Views/DOMStorageContentView.js:
+        (WI.DOMStorageContentView):
+        (WI.DOMStorageContentView.prototype.get navigationItems):
+        (WI.DOMStorageContentView.prototype._handleClearNavigationItemClicked): Added.
+        Add a "Clear" navigation item that calls the new `DOMStorage.clearDOMStorageItems`.
+
+        * UserInterface/Views/DataGrid.js:
+        (WI.DataGrid.prototype.removeChild):
+        If the removed item was selected, select the next (or previous if there is no next) item.
+
+        * UserInterface/Views/CookieStorageContentView.js:
+        (WI.CookieStorageContentView):
+        (WI.CookieStorageContentView.prototype.get navigationItems):
+        (WI.CookieStorageContentView.prototype._handleClearNavigationItemClicked): Added.
+        Drive-by: also add a "Clear" navigation item that calls `Page.deleteCookie` for each row.
+
+        * UserInterface/Protocol/DOMStorageObserver.js:
+        (WI.DOMStorageObserver.prototype.domStorageItemUpdated):
+        * UserInterface/Controllers/DOMStorageManager.js:
+        (WI.DOMStorageManager.prototype.itemUpdated):
+        Drive-by: rename `value` to `newValue` to match the protocol.
+
+        * Localizations/en.lproj/localizedStrings.js:
+
+2020-04-08  Devin Rousso  <[email protected]>
+
         Web Inspector: Uncaught Exception: undefined is not an object (evaluating 'this._target.NetworkAgent.getResponseBody')
         https://bugs.webkit.org/show_bug.cgi?id=210168
 

Modified: trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js (259743 => 259744)


--- trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js	2020-04-08 19:16:34 UTC (rev 259744)
@@ -264,9 +264,12 @@
 localizedStrings["Cipher"] = "Cipher";
 localizedStrings["Clamp to sRGB"] = "Clamp to sRGB";
 localizedStrings["Classes"] = "Classes";
+localizedStrings["Clear Cookies"] = "Clear Cookies";
 localizedStrings["Clear Filters"] = "Clear Filters";
+localizedStrings["Clear Local Storage"] = "Clear Local Storage";
 localizedStrings["Clear Log"] = "Clear Log";
 localizedStrings["Clear Network Items (%s)"] = "Clear Network Items (%s)";
+localizedStrings["Clear Session Storage"] = "Clear Session Storage";
 localizedStrings["Clear Timeline (%s)"] = "Clear Timeline (%s)";
 localizedStrings["Clear focus"] = "Clear focus";
 localizedStrings["Clear log (%s or %s)"] = "Clear log (%s or %s)";

Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMStorageManager.js (259743 => 259744)


--- trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMStorageManager.js	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMStorageManager.js	2020-04-08 19:16:34 UTC (rev 259744)
@@ -131,13 +131,13 @@
             domStorage.itemAdded(key, value);
     }
 
-    itemUpdated(storageId, key, oldValue, value)
+    itemUpdated(storageId, key, oldValue, newValue)
     {
         console.assert(this._enabled);
 
         let domStorage = this._domStorageForIdentifier(storageId);
         if (domStorage)
-            domStorage.itemUpdated(key, oldValue, value);
+            domStorage.itemUpdated(key, oldValue, newValue);
     }
 
     // InspectorObserver

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/DOMStorageObject.js (259743 => 259744)


--- trunk/Source/WebInspectorUI/UserInterface/Models/DOMStorageObject.js	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/DOMStorageObject.js	2020-04-08 19:16:34 UTC (rev 259744)
@@ -75,38 +75,64 @@
 
     removeItem(key)
     {
+        console.assert(this._entries.has(key));
+
         let target = WI.assumingMainTarget();
-        target.DOMStorageAgent.removeDOMStorageItem(this._id, key);
+        return target.DOMStorageAgent.removeDOMStorageItem(this._id, key);
     }
 
     setItem(key, value)
     {
         let target = WI.assumingMainTarget();
-        target.DOMStorageAgent.setDOMStorageItem(this._id, key, value);
+        return target.DOMStorageAgent.setDOMStorageItem(this._id, key, value);
     }
 
+    clear()
+    {
+        let target = WI.assumingMainTarget();
+
+        // COMPATIBILITY (iOS 13.4): DOMStorage.clearDOMStorageItems did not exist yet.
+        if (!target.hasCommand("DOMStorage.clearDOMStorageItems")) {
+            let promises = [];
+            for (let key of this._entries.keys())
+                promises.push(this.removeItem(key));
+            return Promise.all(promises);
+        }
+
+        return target.DOMStorageAgent.clearDOMStorageItems(this._id);
+    }
+
+    // DOMStorageManager
+
     itemsCleared()
     {
         this._entries.clear();
+
         this.dispatchEventToListeners(WI.DOMStorageObject.Event.ItemsCleared);
     }
 
     itemRemoved(key)
     {
-        this._entries.delete(key);
+        let removed = this._entries.delete(key);
+        console.assert(removed);
+
         this.dispatchEventToListeners(WI.DOMStorageObject.Event.ItemRemoved, {key});
     }
 
     itemAdded(key, value)
     {
+        console.assert(!this._entries.has(key));
         this._entries.set(key, value);
+
         this.dispatchEventToListeners(WI.DOMStorageObject.Event.ItemAdded, {key, value});
     }
 
-    itemUpdated(key, oldValue, value)
+    itemUpdated(key, oldValue, newValue)
     {
-        this._entries.set(key, value);
-        this.dispatchEventToListeners(WI.DOMStorageObject.Event.ItemUpdated, {key, oldValue, value});
+        console.assert(this._entries.get(key) === oldValue);
+        this._entries.set(key, newValue);
+
+        this.dispatchEventToListeners(WI.DOMStorageObject.Event.ItemUpdated, {key, oldValue, newValue});
     }
 };
 

Modified: trunk/Source/WebInspectorUI/UserInterface/Protocol/DOMStorageObserver.js (259743 => 259744)


--- trunk/Source/WebInspectorUI/UserInterface/Protocol/DOMStorageObserver.js	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebInspectorUI/UserInterface/Protocol/DOMStorageObserver.js	2020-04-08 19:16:34 UTC (rev 259744)
@@ -43,8 +43,8 @@
         WI.domStorageManager.itemAdded(storageId, key, value);
     }
 
-    domStorageItemUpdated(storageId, key, oldValue, value)
+    domStorageItemUpdated(storageId, key, oldValue, newValue)
     {
-        WI.domStorageManager.itemUpdated(storageId, key, oldValue, value);
+        WI.domStorageManager.itemUpdated(storageId, key, oldValue, newValue);
     }
 };

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/CookieStorageContentView.js (259743 => 259744)


--- trunk/Source/WebInspectorUI/UserInterface/Views/CookieStorageContentView.js	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/CookieStorageContentView.js	2020-04-08 19:16:34 UTC (rev 259744)
@@ -42,6 +42,10 @@
 
         this._refreshButtonNavigationItem = new WI.ButtonNavigationItem("cookie-storage-refresh", WI.UIString("Refresh"), "Images/ReloadFull.svg", 13, 13);
         this._refreshButtonNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, this._refreshButtonClicked, this);
+
+        this._clearButtonNavigationItem = new WI.ButtonNavigationItem("cookie-storage-clear", WI.UIString("Clear Cookies"), "Images/NavigationItemTrash.svg", 15, 15);
+        this._clearButtonNavigationItem.visibilityPriority = WI.NavigationItem.VisibilityPriority.Low;
+        this._clearButtonNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, this._handleClearNavigationItemClicked, this);
     }
 
     // Public
@@ -52,6 +56,7 @@
         if (this._setCookieButtonNavigationItem)
             navigationItems.push(this._setCookieButtonNavigationItem);
         navigationItems.push(this._refreshButtonNavigationItem);
+        navigationItems.push(this._clearButtonNavigationItem);
         return navigationItems;
     }
 
@@ -392,6 +397,15 @@
         this._reloadCookies();
     }
 
+    _handleClearNavigationItemClicked(event)
+    {
+        let target = WI.assumingMainTarget();
+        for (let cookie of this._cookies.splice(0))
+            target.PageAgent.deleteCookie(cookie.name, cookie.url);
+
+        this._table.reloadData();
+    }
+
     _reloadCookies()
     {
         let target = WI.assumingMainTarget();

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DOMStorageContentView.js (259743 => 259744)


--- trunk/Source/WebInspectorUI/UserInterface/Views/DOMStorageContentView.js	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DOMStorageContentView.js	2020-04-08 19:16:34 UTC (rev 259744)
@@ -55,6 +55,11 @@
         this._filterBarNavigationItem = new WI.FilterBarNavigationItem;
         this._filterBarNavigationItem.filterBar.addEventListener(WI.FilterBar.Event.FilterDidChange, this._handleFilterBarFilterDidChange, this);
 
+        let clearButtonLabel = representedObject.isLocalStorage() ? WI.UIString("Clear Local Storage") : WI.UIString("Clear Session Storage");
+        this._clearButtonNavigationItem = new WI.ButtonNavigationItem("dom-storage-clear", clearButtonLabel, "Images/NavigationItemTrash.svg", 15, 15);
+        this._clearButtonNavigationItem.visibilityPriority = WI.NavigationItem.VisibilityPriority.Low;
+        this._clearButtonNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, this._handleClearNavigationItemClicked, this);
+
         this._populate();
     }
 
@@ -62,7 +67,11 @@
 
     get navigationItems()
     {
-        return [this._filterBarNavigationItem];
+        return [
+            this._filterBarNavigationItem,
+            new WI.DividerNavigationItem,
+            this._clearButtonNavigationItem,
+        ];
     }
 
     saveToCookie(cookie)
@@ -290,6 +299,11 @@
     {
         this._dataGrid.filterText = this._filterBarNavigationItem.filterBar.filters.text || "";
     }
+
+    _handleClearNavigationItemClicked(event)
+    {
+        this.representedObject.clear();
+    }
 };
 
 WI.DOMStorageContentView.DuplicateKeyStyleClassName = "duplicate-key";

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js (259743 => 259744)


--- trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js	2020-04-08 19:12:10 UTC (rev 259743)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js	2020-04-08 19:16:34 UTC (rev 259744)
@@ -1230,6 +1230,8 @@
         if (child.parent !== this)
             return;
 
+        let wasSelected = this.selectedNode === child || child.selected;
+
         child.deselect();
         child._detach();
 
@@ -1240,6 +1242,8 @@
         if (child.nextSibling)
             child.nextSibling.previousSibling = child.previousSibling;
 
+        let nextChildToSelect = wasSelected ? (child.nextSibling || child.previousSibling) : null;
+
         child.dataGrid = null;
         child.parent = null;
         child.nextSibling = null;
@@ -1247,6 +1251,8 @@
 
         if (this.children.length <= 0)
             this.hasChildren = false;
+        else if (nextChildToSelect)
+            nextChildToSelect.select();
 
         console.assert(!child.isPlaceholderNode, "Shouldn't delete the placeholder node.");
     }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to