[DevTools] Fix DOM Storage with OOPIFs

- Collect DOM storages from all targets.
- Instantiate InspectorDOMStorage agent for local roots, make
  it work with InspectedFrames.
- Add a test which dumps storage security origins.
- Do some origin checks on the frontend to avoid listing
  "opaque" security origins which do not support storage.
- Check storage capabilities on the backend to avoid
  crasing renderer later.

Bug: 850978, 844377
Change-Id: Ib4e2b444473638d896eb716fb7d9c587f5560335
Reviewed-on: https://chromium-review.googlesource.com/1096283
Commit-Queue: Dmitry Gozman <dgozman@chromium.org>
Reviewed-by: Alexei Filippov <alph@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#567024}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 1600a1f6c38cc1e3e56d6ad5b48ca88f01ea8ab2
This commit is contained in:
Dmitry Gozman
2018-06-13 22:40:21 +00:00
committed by Commit Bot
parent 56a9936519
commit 0f9be11ebb
3 changed files with 34 additions and 16 deletions
+24 -13
View File
@@ -29,6 +29,7 @@
*/
/**
* @implements {SDK.TargetManager.Observer}
* @implements {SDK.SDKModelObserver<!Resources.DOMStorageModel>}
* @unrestricted
*/
Resources.ApplicationPanelSidebar = class extends UI.VBox {
@@ -197,14 +198,34 @@ Resources.ApplicationPanelSidebar = class extends UI.VBox {
const resourceTreeModel = this._target.model(SDK.ResourceTreeModel);
if (resourceTreeModel)
this._populateApplicationCacheTree(resourceTreeModel);
const domStorageModel = this._target.model(Resources.DOMStorageModel);
if (domStorageModel)
this._populateDOMStorageTree(domStorageModel);
SDK.targetManager.observeModels(Resources.DOMStorageModel, this);
this.indexedDBListTreeElement._initialize();
const serviceWorkerCacheModel = this._target.model(SDK.ServiceWorkerCacheModel);
this.cacheStorageListTreeElement._initialize(serviceWorkerCacheModel);
}
/**
* @override
* @param {!Resources.DOMStorageModel} domStorageModel
*/
modelAdded(domStorageModel) {
domStorageModel.enable();
domStorageModel.storages().forEach(this._addDOMStorage.bind(this));
domStorageModel.addEventListener(Resources.DOMStorageModel.Events.DOMStorageAdded, this._domStorageAdded, this);
domStorageModel.addEventListener(Resources.DOMStorageModel.Events.DOMStorageRemoved, this._domStorageRemoved, this);
}
/**
* @override
* @param {!Resources.DOMStorageModel} domStorageModel
*/
modelRemoved(domStorageModel) {
domStorageModel.storages().forEach(this._removeDOMStorage.bind(this));
domStorageModel.removeEventListener(Resources.DOMStorageModel.Events.DOMStorageAdded, this._domStorageAdded, this);
domStorageModel.removeEventListener(
Resources.DOMStorageModel.Events.DOMStorageRemoved, this._domStorageRemoved, this);
}
_resetWithFrames() {
this._resourcesSection.reset();
this._reset();
@@ -442,16 +463,6 @@ Resources.ApplicationPanelSidebar = class extends UI.VBox {
database.getTableNames(tableNamesCallback);
}
/**
* @param {!Resources.DOMStorageModel} domStorageModel
*/
_populateDOMStorageTree(domStorageModel) {
domStorageModel.enable();
domStorageModel.storages().forEach(this._addDOMStorage.bind(this));
domStorageModel.addEventListener(Resources.DOMStorageModel.Events.DOMStorageAdded, this._domStorageAdded, this);
domStorageModel.addEventListener(Resources.DOMStorageModel.Events.DOMStorageRemoved, this._domStorageRemoved, this);
}
/**
* @param {!SDK.ResourceTreeModel} resourceTreeModel
*/
+8 -2
View File
@@ -162,6 +162,11 @@ Resources.DOMStorageModel = class extends SDK.SDKModel {
* @param {string} securityOrigin
*/
_addOrigin(securityOrigin) {
const parsed = new Common.ParsedURL(securityOrigin);
// These are "opaque" origins which are not supposed to support DOM storage.
if (!parsed.isValid || parsed.scheme === 'data' || parsed.scheme === 'about' || parsed.scheme === 'javascript')
return;
for (const isLocal of [true, false]) {
const key = this._storageKey(securityOrigin, isLocal);
console.assert(!this._storages[key]);
@@ -185,7 +190,8 @@ Resources.DOMStorageModel = class extends SDK.SDKModel {
for (const isLocal of [true, false]) {
const key = this._storageKey(securityOrigin, isLocal);
const storage = this._storages[key];
console.assert(storage);
if (!storage)
continue;
delete this._storages[key];
this.dispatchEventToListeners(Resources.DOMStorageModel.Events.DOMStorageRemoved, storage);
}
@@ -273,7 +279,7 @@ Resources.DOMStorageModel = class extends SDK.SDKModel {
}
};
SDK.SDKModel.register(Resources.DOMStorageModel, SDK.Target.Capability.None, false);
SDK.SDKModel.register(Resources.DOMStorageModel, SDK.Target.Capability.DOM, false);
/** @enum {symbol} */
Resources.DOMStorageModel.Events = {
+2 -1
View File
@@ -76,8 +76,9 @@ SDK.TargetManager = class extends Common.Object {
* @template T
*/
observeModels(modelClass, observer) {
const models = this.models(modelClass);
this._modelObservers.set(modelClass, observer);
for (const model of this.models(modelClass))
for (const model of models)
observer.modelAdded(model);
}