我正在寻找一种方法来触发与Chrome开发工具中的“清除网站数据”相同的行为,或者尽可能接近相同的行为.我知道有 some things that are not possible i.e. clearing browser cache,这不需要在这个问题的范围内.我不确定Clear Site Data是否除了清除cookie,Web SQL / IndexedDB和取消注册服务工作者之外还做了一些特殊的事情.
我在我工作的一些项目中使用了localForage,所以清理IndexedDB / localStorage相当简单并且确保调用清楚但我不熟悉其他部分的幕后情况或者我可能遗漏的东西.对于上下文,在我的应用程序中有时候我会看到尴尬的回归(我做了一些更新但他们没有更新).我有一个清除localStorage和cookies的编程触发器,但它不能解决问题,但是点击“清除站点数据”并检查所有内容.
另外注意我还发现了关于clear site data headers的W3C规范草案?我不确定这是否是我们可能采取的方向,以触发明确的网站数据?任何信息都将非常受欢迎.
在没有得到任何答案之后就这样了,决定深入研究一些源代码.我找到了 Chrome Devtools的存储库以及他们从UI (can be found in resources/ClearStorageView.js)实际调用this._clear的代码.
_clear() {if (!this._securityOrigin)return;const storageTypes = [];for (const type of this._settings.keys()) {if (this._settings.get(type).get())storageTypes.push(type);}this._target.storageAgent().clearDataForOrigin(this._securityOrigin, storageTypes.join(','));const set = new Set(storageTypes);const hasAll = set.has(Protocol.Storage.StorageType.All);if (set.has(Protocol.Storage.StorageType.Cookies) || hasAll) {const cookieModel = this._target.model(SDK.CookieModel);if (cookieModel)cookieModel.clear();}if (set.has(Protocol.Storage.StorageType.Indexeddb) || hasAll) {for (const target of SDK.targetManager.targets()) {const indexedDBModel = target.model(Resources.IndexedDBModel);if (indexedDBModel)indexedDBModel.clearForOrigin(this._securityOrigin);}}if (set.has(Protocol.Storage.StorageType.Local_storage) || hasAll) {const storageModel = this._target.model(Resources.DOMStorageModel);if (storageModel)storageModel.clearForOrigin(this._securityOrigin);}if (set.has(Protocol.Storage.StorageType.Websql) || hasAll) {const databaseModel = this._target.model(Resources.DatabaseModel);if (databaseModel) {databaseModel.disable();databaseModel.enable();}}if (set.has(Protocol.Storage.StorageType.Cache_storage) || hasAll) {const target = SDK.targetManager.mainTarget();const model = target && target.model(SDK.ServiceWorkerCacheModel);if (model)model.clearForOrigin(this._securityOrigin);}if (set.has(Protocol.Storage.StorageType.Appcache) || hasAll) {const appcacheModel = this._target.model(Resources.ApplicationCacheModel);if (appcacheModel)appcacheModel.reset();}this._clearButton.disabled = true;const label = this._clearButton.textContent;this._clearButton.textContent = Common.UIString('Clearing...');setTimeout(() => {this._clearButton.disabled = false;this._clearButton.textContent = label;}, 500);}
我认为tl; dr自然是他们的Clear Site数据挂钩到他们在表单上的复选框选项,并通过并清除选项.在我最初的问题中,我个人想知道是否有更多的东西而不仅仅是那样,看起来他们确实在最顶层打电话,无论你检查了什么:
this._target.storageAgent().clearDataForOrigin(this._securityOrigin, storageTypes.join(','));
不知道这是什么,但做了一些挖掘,看起来可能是一些experimental API for clearing data from origin for Lighthouse apps.我个人不确定或觉得有资格说这是正确的.希望这有助于人们.