WebKit Bugzilla
Attachment 350042 Details for
Bug 66381
: Web Inspector: support multiple selection/deletion of cookie records
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
WIP
bug-66381-20180918130005.patch (text/plain), 13.61 KB, created by
Matt Baker
on 2018-09-18 13:00:09 PDT
(
hide
)
Description:
WIP
Filename:
MIME Type:
Creator:
Matt Baker
Created:
2018-09-18 13:00:09 PDT
Size:
13.61 KB
patch
obsolete
>Subversion Revision: 236149 >diff --git a/Source/WebInspectorUI/ChangeLog b/Source/WebInspectorUI/ChangeLog >index 0328d8118bf8b7d7ff1168830c7bfa9ac95550ac..cadfe813ff1fbac2e7472d9fdf3641f6f35b9fcd 100644 >--- a/Source/WebInspectorUI/ChangeLog >+++ b/Source/WebInspectorUI/ChangeLog >@@ -1,3 +1,29 @@ >+2018-09-18 Matt Baker <mattbaker@apple.com> >+ >+ Web Inspector: support multiple selection/deletion of cookie records >+ https://bugs.webkit.org/show_bug.cgi?id=66381 >+ <rdar://problem/19281525> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * UserInterface/Views/CookieStorageContentView.js: >+ (WI.CookieStorageContentView): >+ (WI.CookieStorageContentView.prototype.update): >+ (WI.CookieStorageContentView.prototype.get scrollableElements): >+ (WI.CookieStorageContentView.prototype.tableNumberOfRows): >+ (WI.CookieStorageContentView.prototype.tableSortChanged): >+ (WI.CookieStorageContentView.prototype.tableCellMouseDown): >+ (WI.CookieStorageContentView.prototype.tableCellContextMenuClicked): >+ (WI.CookieStorageContentView.prototype.tableSelectedRowChanged): >+ (WI.CookieStorageContentView.prototype.tablePopulateCell): >+ (WI.CookieStorageContentView.prototype.initialLayout): >+ (WI.CookieStorageContentView.prototype._generateSortComparator): >+ (WI.CookieStorageContentView.prototype._rebuildTable): Deleted. >+ (WI.CookieStorageContentView.prototype._sortDataGrid.localeCompare): Deleted. >+ (WI.CookieStorageContentView.prototype._sortDataGrid.numberCompare): Deleted. >+ (WI.CookieStorageContentView.prototype._sortDataGrid.expiresCompare): Deleted. >+ (WI.CookieStorageContentView.prototype._sortDataGrid): Deleted. >+ > 2018-09-17 Devin Rousso <drousso@apple.com> > > Web Inspector: generate CSSKeywordCompletions from backend values >diff --git a/Source/WebInspectorUI/UserInterface/Views/CookieStorageContentView.js b/Source/WebInspectorUI/UserInterface/Views/CookieStorageContentView.js >index 0f6f62716fc53ffc63bcadd24786b77c006e91fd..1f31a78bc0a892d3326d155dcf7774084c09b815 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/CookieStorageContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/CookieStorageContentView.js >@@ -31,6 +31,9 @@ WI.CookieStorageContentView = class CookieStorageContentView extends WI.ContentV > > this.element.classList.add("cookie-storage"); > >+ this._cookies = []; >+ this._table = null; >+ > 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); > >@@ -48,7 +51,7 @@ WI.CookieStorageContentView = class CookieStorageContentView extends WI.ContentV > { > PageAgent.getCookies().then((payload) => { > this._cookies = this._filterCookies(payload.cookies); >- this._rebuildTable(); >+ this._table.reloadData(); > }).catch((error) => { > console.error("Could not fetch cookies: ", error); > }); >@@ -62,97 +65,117 @@ WI.CookieStorageContentView = class CookieStorageContentView extends WI.ContentV > > get scrollableElements() > { >- if (!this._dataGrid) >+ if (!this._table) > return []; >- return [this._dataGrid.scrollContainer]; >+ return [this._table.scrollContainer]; > } > >- // Private >+ // Table dataSource > >- _rebuildTable() >- { >- // FIXME <https://webkit.org/b/151400>: If there are no cookies, add placeholder explanatory text. >- if (!this._dataGrid) { >- var columns = {name: {}, value: {}, domain: {}, path: {}, expires: {}, size: {}, http: {}, secure: {}, sameSite: {}}; >- >- columns.name.title = WI.UIString("Name"); >- columns.name.sortable = true; >- columns.name.width = "24%"; >- columns.name.locked = true; >- >- columns.value.title = WI.UIString("Value"); >- columns.value.sortable = true; >- columns.value.width = "34%"; >- columns.value.locked = true; >- >- columns.domain.title = WI.UIString("Domain"); >- columns.domain.sortable = true; >- columns.domain.width = "6%"; >- >- columns.path.title = WI.UIString("Path"); >- columns.path.sortable = true; >- columns.path.width = "6%"; >- >- columns.expires.title = WI.UIString("Expires"); >- columns.expires.sortable = true; >- columns.expires.width = "6%"; >- >- columns.size.title = WI.UIString("Size"); >- columns.size.aligned = "right"; >- columns.size.sortable = true; >- columns.size.width = "6%"; >- >- columns.http.title = WI.UIString("HTTP"); >- columns.http.aligned = "centered"; >- columns.http.sortable = true; >- columns.http.width = "6%"; >- >- columns.secure.title = WI.UIString("Secure"); >- columns.secure.aligned = "centered"; >- columns.secure.sortable = true; >- columns.secure.width = "6%"; >- >- columns.sameSite.title = WI.UIString("Same-Site"); >- columns.sameSite.sortable = true; >- columns.sameSite.width = "6%"; >- >- this._dataGrid = new WI.DataGrid(columns, null, this._deleteCallback.bind(this)); >- this._dataGrid.columnChooserEnabled = true; >- this._dataGrid.addEventListener(WI.DataGrid.Event.SortChanged, this._sortDataGrid, this); >- this._dataGrid.sortColumnIdentifier = "name"; >- this._dataGrid.createSettings("cookie-storage-content-view"); >- >- this.addSubview(this._dataGrid); >- this._dataGrid.updateLayout(); >- } >+ tableNumberOfRows(table) >+ { >+ return this._cookies.length; >+ } > >- console.assert(this._dataGrid); >- this._dataGrid.removeChildren(); >- >- for (let cookie of this._cookies) { >- const checkmark = "\u2713"; >- var data = { >- name: cookie.name, >- value: cookie.value, >- domain: cookie.domain || "", >- path: cookie.path || "", >- expires: "", >- size: Number.bytesToString(cookie.size), >- http: cookie.httpOnly ? checkmark : "", >- secure: cookie.secure ? checkmark : "", >- sameSite: cookie.sameSite && cookie.sameSite !== WI.Cookie.SameSiteType.None ? WI.Cookie.displayNameForSameSiteType(cookie.sameSite) : "", >- }; >+ tableSortChanged(table) >+ { >+ let comparator = this._generateSortComparator(); >+ if (!comparator) >+ return; >+ >+ this._cookies = this._cookies.sort(comparator); >+ this._table.reloadData(); >+ } >+ >+ // Table delegate >+ >+ tableCellMouseDown(table, cell, column, rowIndex, event) >+ { >+ this._table.selectRow(rowIndex); >+ } >+ >+ tableCellContextMenuClicked(table, cell, column, rowIndex, event) >+ { >+ if (column !== this._nameColumn) >+ return; >+ >+ this._table.selectRow(rowIndex); >+ >+ let entry = this._filteredEntries[rowIndex]; >+ let contextMenu = WI.ContextMenu.createFromEvent(event); >+ WI.appendContextMenuItemsForSourceCode(contextMenu, entry.resource); > >- if (cookie.type !== WI.CookieType.Request) >- data["expires"] = cookie.session ? WI.UIString("Session") : new Date(cookie.expires).toLocaleString(); >+ contextMenu.appendSeparator(); >+ contextMenu.appendItem(WI.UIString("Export HAR"), () => { this._exportHAR(); }); >+ } > >- var node = new WI.DataGridNode(data); >- node.cookie = cookie; >+ tableSelectedRowChanged(table, rowIndex) >+ { >+ } > >- this._dataGrid.appendChild(node); >+ tablePopulateCell(table, cell, column, rowIndex) >+ { >+ let cookie = this._cookies[rowIndex]; >+ >+ const checkmark = "\u2713"; >+ >+ switch (column.identifier) { >+ case "name": >+ cell.textContent = cookie.name; >+ break; >+ case "value": >+ cell.textContent = cookie.value; >+ break; >+ case "domain": >+ cell.textContent = cookie.domain || emDash; >+ break; >+ case "path": >+ cell.textContent = cookie.path || emDash; >+ break; >+ case "expires": >+ cell.textContent = cookie.expires ? cookie.expires.toLocaleString() : WI.UIString("Session"); >+ break; >+ case "secure": >+ cell.textContent = cookie.secure ? checkmark : zeroWidthSpace; >+ break; >+ case "httpOnly": >+ cell.textContent = cookie.httpOnly ? checkmark : zeroWidthSpace; >+ break; >+ case "sameSite": >+ cell.textContent = cookie.sameSite === WI.Cookie.SameSiteType.None ? emDash : WI.Cookie.displayNameForSameSiteType(cookie.sameSite); >+ break; > } >+ >+ return cell; > } > >+ // Protected >+ >+ initialLayout() >+ { >+ super.initialLayout(); >+ >+ this._table = new WI.Table("cookies-table", this, this, 20); >+ this._table.allowsMultipleSelection = true; >+ >+ this._table.addColumn(new WI.TableColumn("name", WI.UIString("Name"), {minWidth: 150, maxWidth: 300, initialWidth: 200, resizeType: WI.TableColumn.ResizeType.Locked})); >+ this._table.addColumn(new WI.TableColumn("value", WI.UIString("Value"), {minWidth: 150, hideable: false})); >+ this._table.addColumn(new WI.TableColumn("domain", WI.unlocalizedString("Domain"), {})); >+ this._table.addColumn(new WI.TableColumn("path", WI.unlocalizedString("Path"), {})); >+ this._table.addColumn(new WI.TableColumn("expires", WI.unlocalizedString("Expires"), {maxWidth: 150})); >+ this._table.addColumn(new WI.TableColumn("secure", WI.unlocalizedString("Secure"), {minWidth: 55, maxWidth: 65, align: "center"})); >+ this._table.addColumn(new WI.TableColumn("httpOnly", WI.unlocalizedString("HttpOnly"), {minWidth: 55, maxWidth: 65, align: "center"})); >+ this._table.addColumn(new WI.TableColumn("sameSite", WI.unlocalizedString("SameSite"), {minWidth: 55, maxWidth: 65})); >+ >+ if (!this._table.sortColumnIdentifier) { >+ this._table.sortOrder = WI.Table.SortOrder.Ascending; >+ this._table.sortColumnIdentifier = "name"; >+ } >+ >+ this.addSubview(this._table); >+ } >+ // Private >+ > _filterCookies(cookies) > { > let resourceMatchesStorageDomain = (resource) => { >@@ -176,45 +199,51 @@ WI.CookieStorageContentView = class CookieStorageContentView extends WI.ContentV > return cookiesForDomain; > } > >- _sortDataGrid() >+ _generateSortComparator() > { >- function localeCompare(field, nodeA, nodeB) >- { >- return (nodeA.data[field] + "").extendedLocaleCompare(nodeB.data[field] + ""); >- } >- >- function numberCompare(field, nodeA, nodeB) >- { >- return nodeA.cookie[field] - nodeB.cookie[field]; >+ let sortColumnIdentifier = this._table.sortColumnIdentifier; >+ if (!sortColumnIdentifier) { >+ this._entriesSortComparator = null; >+ return; > } > >- function expiresCompare(nodeA, nodeB) >- { >- if (nodeA.cookie.session !== nodeB.cookie.session) >- return nodeA.cookie.session ? -1 : 1; >- >- if (nodeA.cookie.session) >- return 0; >- >- return nodeA.cookie.expires - nodeB.cookie.expires; >- } >+ let comparator = null; >+ >+ switch (sortColumnIdentifier) { >+ case "name": >+ case "value": >+ case "domain": >+ case "path": >+ case "sameSite": >+ // String. >+ comparator = (a, b) => (a[sortColumnIdentifier] || "").extendedLocaleCompare(b[sortColumnIdentifier] || ""); >+ break; >+ >+ case "httpOnly": >+ case "secure": >+ // Boolean. >+ comparator = (a, b) => a[sortColumnIdentifier] - b[sortColumnIdentifier]; >+ break; >+ >+ case "expires": >+ // Date. >+ comparator = (a, b) => { >+ let aExpires = a.expires; >+ if (!aExpires) >+ return 1; >+ let bExpires = b.expires; >+ if (!bExpires) >+ return -1; >+ return aExpires.getTime() - bExpires.getTime(); >+ }; >+ break; > >- var comparator; >- switch (this._dataGrid.sortColumnIdentifier) { >- case "value": comparator = localeCompare.bind(this, "value"); break; >- case "domain": comparator = localeCompare.bind(this, "domain"); break; >- case "path": comparator = localeCompare.bind(this, "path"); break; >- case "expires": comparator = expiresCompare; break; >- case "size": comparator = numberCompare.bind(this, "size"); break; >- case "http": comparator = localeCompare.bind(this, "http"); break; >- case "secure": comparator = localeCompare.bind(this, "secure"); break; >- case "sameSite": comparator = localeCompare.bind(this, "sameSite"); break; >- case "name": >- default: comparator = localeCompare.bind(this, "name"); break; >+ default: >+ console.assert("Unexpected sort column", sortColumnIdentifier); > } > >- console.assert(comparator); >- this._dataGrid.sortNodes(comparator); >+ let reverseFactor = this._table.sortOrder === WI.Table.SortOrder.Ascending ? 1 : -1; >+ return (a, b) => reverseFactor * comparator(a, b); > } > > _deleteCallback(node)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 66381
:
350042
|
351546
|
353102
|
353155
|
353635
|
353723