⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 259744 in webkit


Ignore:
Timestamp:
Apr 8, 2020, 12:16:34 PM (6 years ago)
Author:
Devin Rousso
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/JavaScriptCore:

  • 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):

Location:
trunk
Files:
10 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r259736 r259744  
     12020-04-08  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: Storage: cannot clear out multiple or all local storage entries
     4        https://bugs.webkit.org/show_bug.cgi?id=209867
     5
     6        Reviewed by Timothy Hatcher.
     7
     8        * inspector/storage/clearDOMStorageItems.html: Added.
     9        * inspector/storage/clearDOMStorageItems-expected.txt: Added.
     10        * inspector/storage/domStorage-events.html:
     11        * inspector/storage/domStorage-events-expected.txt:
     12        * inspector/storage/getDOMStorageItems.html: Added.
     13        * inspector/storage/getDOMStorageItems-expected.txt: Added.
     14        * inspector/storage/removeDOMStorageItem.html: Added.
     15        * inspector/storage/removeDOMStorageItem-expected.txt: Added.
     16        * inspector/storage/setDOMStorageItem.html: Added.
     17        * inspector/storage/setDOMStorageItem-expected.txt: Added.
     18        * inspector/storage/resources/storage-utilities.js: Added.
     19        (clearStorages):
     20        (TestPage.registerInitializer.InspectorTest.Storage.async logEntries):
     21
    1222020-04-08  Diego Pino Garcia  <dpino@igalia.com>
    223
  • trunk/LayoutTests/inspector/storage/domStorage-events-expected.txt

    r220119 r259744  
    1414PASS: Should update key 'x'.
    1515PASS: Should have oldValue 'value1'.
    16 PASS: Should have new value 'value2'.
     16PASS: Should have newValue 'value2'.
    1717PASS: WI.DOMStorageObject.Event.ItemRemoved
    1818PASS: Should remove key 'x'.
     
    3030PASS: Should update key 'x'.
    3131PASS: Should have oldValue 'value1'.
    32 PASS: Should have new value 'value2'.
     32PASS: Should have newValue 'value2'.
    3333PASS: WI.DOMStorageObject.Event.ItemRemoved
    3434PASS: Should remove key 'x'.
  • trunk/LayoutTests/inspector/storage/domStorage-events.html

    r236766 r259744  
    2626            if (count === 1) {
    2727                InspectorTest.pass("WI.DOMStorageObject.Event.ItemAdded");
    28                 InspectorTest.expectThat(event.data.key === "foo", "Should add key 'foo'.");
    29                 InspectorTest.expectThat(event.data.value === "value1", "Should have value 'value1'.");
     28                InspectorTest.expectEqual(event.data.key, "foo", "Should add key 'foo'.");
     29                InspectorTest.expectEqual(event.data.value, "value1", "Should have value 'value1'.");
    3030                return;
    3131            }
     
    3333            if (count === 2) {
    3434                InspectorTest.pass("WI.DOMStorageObject.Event.ItemAdded");
    35                 InspectorTest.expectThat(event.data.key === "x", "Should add key 'x'.");
    36                 InspectorTest.expectThat(event.data.value === "xvalue", "Should have value 'xvalue'.");
     35                InspectorTest.expectEqual(event.data.key, "x", "Should add key 'x'.");
     36                InspectorTest.expectEqual(event.data.value, "xvalue", "Should have value 'xvalue'.");
    3737                return;
    3838            }
     
    4444        .then((event) => {
    4545            InspectorTest.pass("WI.DOMStorageObject.Event.ItemRemoved");
    46             InspectorTest.expectThat(event.data.key === "foo", "Should remove key 'x'.");
     46            InspectorTest.expectEqual(event.data.key, "foo", "Should remove key 'x'.");
    4747        });
    4848
     
    5050        .then((event) => {
    5151            InspectorTest.pass("WI.DOMStorageObject.Event.ItemUpdated");
    52             InspectorTest.expectThat(event.data.key === "foo", "Should update key 'x'.");
    53             InspectorTest.expectThat(event.data.oldValue === "value1", "Should have oldValue 'value1'.");
    54             InspectorTest.expectThat(event.data.value === "value2", "Should have new value 'value2'.");
     52            InspectorTest.expectEqual(event.data.key, "foo", "Should update key 'x'.");
     53            InspectorTest.expectEqual(event.data.oldValue, "value1", "Should have oldValue 'value1'.");
     54            InspectorTest.expectEqual(event.data.newValue, "value2", "Should have newValue 'value2'.");
    5555        });
    5656
  • trunk/Source/JavaScriptCore/ChangeLog

    r259742 r259744  
     12020-04-08  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: Storage: cannot clear out multiple or all local storage entries
     4        https://bugs.webkit.org/show_bug.cgi?id=209867
     5
     6        Reviewed by Timothy Hatcher.
     7
     8        * inspector/protocol/DOMStorage.json:
     9        Add a `clearDOMStorageItems` command instead of calling `removeDOMStorageItem` for each key.
     10
    1112020-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
    212
  • trunk/Source/JavaScriptCore/inspector/protocol/DOMStorage.json

    r251227 r259744  
    5353                { "name": "key", "type": "string" }
    5454            ]
     55        },
     56        {
     57            "name": "clearDOMStorageItems",
     58            "parameters": [
     59                { "name": "storageId", "$ref": "StorageId" }
     60            ]
    5561        }
    5662    ],
  • trunk/Source/WebCore/ChangeLog

    r259737 r259744  
     12020-04-08  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: Storage: cannot clear out multiple or all local storage entries
     4        https://bugs.webkit.org/show_bug.cgi?id=209867
     5
     6        Reviewed by Timothy Hatcher.
     7
     8        Tests: inspector/storage/clearDOMStorageItems.html
     9               inspector/storage/getDOMStorageItems.html
     10               inspector/storage/removeDOMStorageItem.html
     11               inspector/storage/setDOMStorageItem.html
     12
     13        * inspector/agents/InspectorDOMStorageAgent.h:
     14        * inspector/agents/InspectorDOMStorageAgent.cpp:
     15        (WebCore::InspectorDOMStorageAgent::clearDOMStorageItems): Added.
     16        Add a `clearDOMStorageItems` command instead of calling `removeDOMStorageItem` for each key.
     17
    1182020-04-08  Kenneth Russell  <kbr@chromium.org>
    219
  • trunk/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.cpp

    r249132 r259744  
    146146}
    147147
     148void InspectorDOMStorageAgent::clearDOMStorageItems(ErrorString& errorString, const JSON::Object& storageId)
     149{
     150    Frame* frame;
     151    auto storageArea = findStorageArea(errorString, storageId, frame);
     152    if (!storageArea) {
     153        errorString = "Missing storage for given storageId"_s;
     154        return;
     155    }
     156
     157    storageArea->clear(frame);
     158}
     159
    148160String InspectorDOMStorageAgent::storageId(Storage& storage)
    149161{
  • trunk/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.h

    r250996 r259744  
    6565    void setDOMStorageItem(ErrorString&, const JSON::Object& storageId, const String& key, const String& value) override;
    6666    void removeDOMStorageItem(ErrorString&, const JSON::Object& storageId, const String& key) override;
     67    void clearDOMStorageItems(ErrorString&, const JSON::Object& storageId) override;
    6768
    6869    // InspectorInstrumentation
  • trunk/Source/WebInspectorUI/ChangeLog

    r259741 r259744  
     12020-04-08  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: Storage: cannot clear out multiple or all local storage entries
     4        https://bugs.webkit.org/show_bug.cgi?id=209867
     5
     6        Reviewed by Timothy Hatcher.
     7
     8        * UserInterface/Models/DOMStorageObject.js:
     9        (WI.DOMStorageObject.prototype.removeItem):
     10        (WI.DOMStorageObject.prototype.setItem):
     11        (WI.DOMStorageObject.prototype.clear): Added.
     12        (WI.DOMStorageObject.prototype.itemsCleared):
     13        (WI.DOMStorageObject.prototype.itemRemoved):
     14        (WI.DOMStorageObject.prototype.itemAdded):
     15        (WI.DOMStorageObject.prototype.itemUpdated):
     16        Add some assertions.
     17
     18        * UserInterface/Views/DOMStorageContentView.js:
     19        (WI.DOMStorageContentView):
     20        (WI.DOMStorageContentView.prototype.get navigationItems):
     21        (WI.DOMStorageContentView.prototype._handleClearNavigationItemClicked): Added.
     22        Add a "Clear" navigation item that calls the new `DOMStorage.clearDOMStorageItems`.
     23
     24        * UserInterface/Views/DataGrid.js:
     25        (WI.DataGrid.prototype.removeChild):
     26        If the removed item was selected, select the next (or previous if there is no next) item.
     27
     28        * UserInterface/Views/CookieStorageContentView.js:
     29        (WI.CookieStorageContentView):
     30        (WI.CookieStorageContentView.prototype.get navigationItems):
     31        (WI.CookieStorageContentView.prototype._handleClearNavigationItemClicked): Added.
     32        Drive-by: also add a "Clear" navigation item that calls `Page.deleteCookie` for each row.
     33
     34        * UserInterface/Protocol/DOMStorageObserver.js:
     35        (WI.DOMStorageObserver.prototype.domStorageItemUpdated):
     36        * UserInterface/Controllers/DOMStorageManager.js:
     37        (WI.DOMStorageManager.prototype.itemUpdated):
     38        Drive-by: rename `value` to `newValue` to match the protocol.
     39
     40        * Localizations/en.lproj/localizedStrings.js:
     41
    1422020-04-08  Devin Rousso  <drousso@apple.com>
    243
  • trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js

    r259437 r259744  
    265265localizedStrings["Clamp to sRGB"] = "Clamp to sRGB";
    266266localizedStrings["Classes"] = "Classes";
     267localizedStrings["Clear Cookies"] = "Clear Cookies";
    267268localizedStrings["Clear Filters"] = "Clear Filters";
     269localizedStrings["Clear Local Storage"] = "Clear Local Storage";
    268270localizedStrings["Clear Log"] = "Clear Log";
    269271localizedStrings["Clear Network Items (%s)"] = "Clear Network Items (%s)";
     272localizedStrings["Clear Session Storage"] = "Clear Session Storage";
    270273localizedStrings["Clear Timeline (%s)"] = "Clear Timeline (%s)";
    271274localizedStrings["Clear focus"] = "Clear focus";
  • trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMStorageManager.js

    r251227 r259744  
    132132    }
    133133
    134     itemUpdated(storageId, key, oldValue, value)
    135     {
    136         console.assert(this._enabled);
    137 
    138         let domStorage = this._domStorageForIdentifier(storageId);
    139         if (domStorage)
    140             domStorage.itemUpdated(key, oldValue, value);
     134    itemUpdated(storageId, key, oldValue, newValue)
     135    {
     136        console.assert(this._enabled);
     137
     138        let domStorage = this._domStorageForIdentifier(storageId);
     139        if (domStorage)
     140            domStorage.itemUpdated(key, oldValue, newValue);
    141141    }
    142142
  • trunk/Source/WebInspectorUI/UserInterface/Models/DOMStorageObject.js

    r251227 r259744  
    7676    removeItem(key)
    7777    {
     78        console.assert(this._entries.has(key));
     79
    7880        let target = WI.assumingMainTarget();
    79         target.DOMStorageAgent.removeDOMStorageItem(this._id, key);
     81        return target.DOMStorageAgent.removeDOMStorageItem(this._id, key);
    8082    }
    8183
     
    8385    {
    8486        let target = WI.assumingMainTarget();
    85         target.DOMStorageAgent.setDOMStorageItem(this._id, key, value);
     87        return target.DOMStorageAgent.setDOMStorageItem(this._id, key, value);
    8688    }
     89
     90    clear()
     91    {
     92        let target = WI.assumingMainTarget();
     93
     94        // COMPATIBILITY (iOS 13.4): DOMStorage.clearDOMStorageItems did not exist yet.
     95        if (!target.hasCommand("DOMStorage.clearDOMStorageItems")) {
     96            let promises = [];
     97            for (let key of this._entries.keys())
     98                promises.push(this.removeItem(key));
     99            return Promise.all(promises);
     100        }
     101
     102        return target.DOMStorageAgent.clearDOMStorageItems(this._id);
     103    }
     104
     105    // DOMStorageManager
    87106
    88107    itemsCleared()
    89108    {
    90109        this._entries.clear();
     110
    91111        this.dispatchEventToListeners(WI.DOMStorageObject.Event.ItemsCleared);
    92112    }
     
    94114    itemRemoved(key)
    95115    {
    96         this._entries.delete(key);
     116        let removed = this._entries.delete(key);
     117        console.assert(removed);
     118
    97119        this.dispatchEventToListeners(WI.DOMStorageObject.Event.ItemRemoved, {key});
    98120    }
     
    100122    itemAdded(key, value)
    101123    {
     124        console.assert(!this._entries.has(key));
    102125        this._entries.set(key, value);
     126
    103127        this.dispatchEventToListeners(WI.DOMStorageObject.Event.ItemAdded, {key, value});
    104128    }
    105129
    106     itemUpdated(key, oldValue, value)
     130    itemUpdated(key, oldValue, newValue)
    107131    {
    108         this._entries.set(key, value);
    109         this.dispatchEventToListeners(WI.DOMStorageObject.Event.ItemUpdated, {key, oldValue, value});
     132        console.assert(this._entries.get(key) === oldValue);
     133        this._entries.set(key, newValue);
     134
     135        this.dispatchEventToListeners(WI.DOMStorageObject.Event.ItemUpdated, {key, oldValue, newValue});
    110136    }
    111137};
  • trunk/Source/WebInspectorUI/UserInterface/Protocol/DOMStorageObserver.js

    r251227 r259744  
    4444    }
    4545
    46     domStorageItemUpdated(storageId, key, oldValue, value)
     46    domStorageItemUpdated(storageId, key, oldValue, newValue)
    4747    {
    48         WI.domStorageManager.itemUpdated(storageId, key, oldValue, value);
     48        WI.domStorageManager.itemUpdated(storageId, key, oldValue, newValue);
    4949    }
    5050};
  • trunk/Source/WebInspectorUI/UserInterface/Views/CookieStorageContentView.js

    r259173 r259744  
    4343        this._refreshButtonNavigationItem = new WI.ButtonNavigationItem("cookie-storage-refresh", WI.UIString("Refresh"), "Images/ReloadFull.svg", 13, 13);
    4444        this._refreshButtonNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, this._refreshButtonClicked, this);
     45
     46        this._clearButtonNavigationItem = new WI.ButtonNavigationItem("cookie-storage-clear", WI.UIString("Clear Cookies"), "Images/NavigationItemTrash.svg", 15, 15);
     47        this._clearButtonNavigationItem.visibilityPriority = WI.NavigationItem.VisibilityPriority.Low;
     48        this._clearButtonNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, this._handleClearNavigationItemClicked, this);
    4549    }
    4650
     
    5357            navigationItems.push(this._setCookieButtonNavigationItem);
    5458        navigationItems.push(this._refreshButtonNavigationItem);
     59        navigationItems.push(this._clearButtonNavigationItem);
    5560        return navigationItems;
    5661    }
     
    391396    {
    392397        this._reloadCookies();
     398    }
     399
     400    _handleClearNavigationItemClicked(event)
     401    {
     402        let target = WI.assumingMainTarget();
     403        for (let cookie of this._cookies.splice(0))
     404            target.PageAgent.deleteCookie(cookie.name, cookie.url);
     405
     406        this._table.reloadData();
    393407    }
    394408
  • trunk/Source/WebInspectorUI/UserInterface/Views/DOMStorageContentView.js

    r253161 r259744  
    5656        this._filterBarNavigationItem.filterBar.addEventListener(WI.FilterBar.Event.FilterDidChange, this._handleFilterBarFilterDidChange, this);
    5757
     58        let clearButtonLabel = representedObject.isLocalStorage() ? WI.UIString("Clear Local Storage") : WI.UIString("Clear Session Storage");
     59        this._clearButtonNavigationItem = new WI.ButtonNavigationItem("dom-storage-clear", clearButtonLabel, "Images/NavigationItemTrash.svg", 15, 15);
     60        this._clearButtonNavigationItem.visibilityPriority = WI.NavigationItem.VisibilityPriority.Low;
     61        this._clearButtonNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, this._handleClearNavigationItemClicked, this);
     62
    5863        this._populate();
    5964    }
     
    6368    get navigationItems()
    6469    {
    65         return [this._filterBarNavigationItem];
     70        return [
     71            this._filterBarNavigationItem,
     72            new WI.DividerNavigationItem,
     73            this._clearButtonNavigationItem,
     74        ];
    6675    }
    6776
     
    291300        this._dataGrid.filterText = this._filterBarNavigationItem.filterBar.filters.text || "";
    292301    }
     302
     303    _handleClearNavigationItemClicked(event)
     304    {
     305        this.representedObject.clear();
     306    }
    293307};
    294308
  • trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js

    r259437 r259744  
    12311231            return;
    12321232
     1233        let wasSelected = this.selectedNode === child || child.selected;
     1234
    12331235        child.deselect();
    12341236        child._detach();
     
    12411243            child.nextSibling.previousSibling = child.previousSibling;
    12421244
     1245        let nextChildToSelect = wasSelected ? (child.nextSibling || child.previousSibling) : null;
     1246
    12431247        child.dataGrid = null;
    12441248        child.parent = null;
     
    12481252        if (this.children.length <= 0)
    12491253            this.hasChildren = false;
     1254        else if (nextChildToSelect)
     1255            nextChildToSelect.select();
    12501256
    12511257        console.assert(!child.isPlaceholderNode, "Shouldn't delete the placeholder node.");
Note: See TracChangeset for help on using the changeset viewer.