Modified: trunk/Source/WebCore/ChangeLog (122228 => 122229)
--- trunk/Source/WebCore/ChangeLog 2012-07-10 16:18:40 UTC (rev 122228)
+++ trunk/Source/WebCore/ChangeLog 2012-07-10 16:23:09 UTC (rev 122229)
@@ -1,3 +1,34 @@
+2012-07-10 Vsevolod Vlasov <[email protected]>
+
+ Web Inspector: Refactor resource revisions before moving to UISourceCode.
+ https://bugs.webkit.org/show_bug.cgi?id=90855
+
+ Reviewed by Pavel Feldman.
+
+ Revisions are now persisted based on mainFrame.loaderId, not resource.loaderId which makes filtering out stale persisted revisions easier.
+ Restoring revisions from local storage is separated from filtering out stale persisted revisions.
+ Resource._clearRevisionHistory and Resource._restoreRevisions are not static anymore.
+ Renamed localStorage field for persisting revisions: "resource-history" -> "revision-history"
+
+ * inspector/front-end/Resource.js:
+ (WebInspector.Resource):
+ (WebInspector.Resource.prototype.addRevision):
+ (WebInspector.Resource.prototype._restoreRevisionHistory):
+ (WebInspector.Resource.prototype._clearRevisionHistory):
+ (WebInspector.Resource.prototype.revertAndClearHistory.clearHistory):
+ (WebInspector.Resource.prototype.revertAndClearHistory):
+ (WebInspector.Revision):
+ (WebInspector.Revision._revisionHistoryRegistry):
+ (WebInspector.Revision._ensureStaleRevisionsFileteredOut.persist):
+ (WebInspector.Revision._ensureStaleRevisionsFileteredOut):
+ (WebInspector.Revision.prototype._persist):
+ * inspector/front-end/ResourceTreeModel.js:
+ (WebInspector.ResourceTreeModel.prototype._processCachedResources):
+ (WebInspector.ResourceTreeModel.prototype._addFramesRecursively):
+ * inspector/front-end/RevisionHistoryView.js:
+ * inspector/front-end/UISourceCode.js:
+ (WebInspector.UISourceCode.prototype._revisionAdded):
+
2012-07-10 Alice Cheng <[email protected]>
Editing: Reproducible crasher when pasting a 0x0 image into Mail
Modified: trunk/Source/WebCore/inspector/front-end/Resource.js (122228 => 122229)
--- trunk/Source/WebCore/inspector/front-end/Resource.js 2012-07-10 16:18:40 UTC (rev 122228)
+++ trunk/Source/WebCore/inspector/front-end/Resource.js 2012-07-10 16:23:09 UTC (rev 122229)
@@ -56,110 +56,10 @@
this._pendingContentCallbacks = [];
if (this._request && !this._request.finished)
this._request.addEventListener(WebInspector.NetworkRequest.Events.FinishedLoading, this._requestFinished, this);
+
+ this._restoreRevisionHistory();
}
-WebInspector.Resource._resourceRevisionRegistry = function()
-{
- if (!WebInspector.Resource._resourceRevisionRegistryObject) {
- if (window.localStorage) {
- var resourceHistory = window.localStorage["resource-history"];
- try {
- WebInspector.Resource._resourceRevisionRegistryObject = resourceHistory ? JSON.parse(resourceHistory) : {};
- } catch (e) {
- WebInspector.Resource._resourceRevisionRegistryObject = {};
- }
- } else
- WebInspector.Resource._resourceRevisionRegistryObject = {};
- }
- return WebInspector.Resource._resourceRevisionRegistryObject;
-}
-
-WebInspector.Resource.restoreRevisions = function()
-{
- var registry = WebInspector.Resource._resourceRevisionRegistry();
- var filteredRegistry = {};
- for (var url in registry) {
- var historyItems = registry[url];
- var resource = WebInspector.resourceForURL(url);
-
- var filteredHistoryItems = [];
- for (var i = 0; historyItems && i < historyItems.length; ++i) {
- var historyItem = historyItems[i];
- if (resource && historyItem.loaderId === resource.loaderId) {
- resource.addRevision(window.localStorage[historyItem.key], new Date(historyItem.timestamp), true);
- filteredHistoryItems.push(historyItem);
- filteredRegistry[url] = filteredHistoryItems;
- } else
- delete window.localStorage[historyItem.key];
- }
- }
- WebInspector.Resource._resourceRevisionRegistryObject = filteredRegistry;
-
- function persist()
- {
- window.localStorage["resource-history"] = JSON.stringify(filteredRegistry);
- }
-
- // Schedule async storage.
- setTimeout(persist, 0);
-}
-
-/**
- * @param {WebInspector.ResourceRevision} revision
- */
-WebInspector.Resource.persistRevision = function(revision)
-{
- if (!window.localStorage)
- return;
-
- if (revision.resource.url.startsWith("inspector://"))
- return;
-
- var resource = revision.resource;
- var url = ""
- var loaderId = resource.loaderId;
- var timestamp = revision.timestamp.getTime();
- var key = "resource-history|" + url + "|" + loaderId + "|" + timestamp;
- var content = revision._content;
-
- var registry = WebInspector.Resource._resourceRevisionRegistry();
-
- var historyItems = registry[resource.url];
- if (!historyItems) {
- historyItems = [];
- registry[resource.url] = historyItems;
- }
- historyItems.push({url: url, loaderId: loaderId, timestamp: timestamp, key: key});
-
- function persist()
- {
- window.localStorage[key] = content;
- window.localStorage["resource-history"] = JSON.stringify(registry);
- }
-
- // Schedule async storage.
- setTimeout(persist, 0);
-}
-
-/**
- * @param {WebInspector.Resource} resource
- */
-WebInspector.Resource._clearResourceHistory = function(resource)
-{
- if (!window.localStorage)
- return;
-
- if (resource.url.startsWith("inspector://"))
- return;
-
- var registry = WebInspector.Resource._resourceRevisionRegistry();
- var historyItems = registry[resource.url];
- for (var i = 0; historyItems && i < historyItems.length; ++i)
- delete window.localStorage[historyItems[i].key];
- delete registry[resource.url];
- window.localStorage["resource-history"] = JSON.stringify(registry);
-}
-
WebInspector.Resource.Events = {
RevisionAdded: "revision-added",
MessageAdded: "message-added",
@@ -339,15 +239,40 @@
if (lastRevision._content === content)
return;
}
- var revision = new WebInspector.ResourceRevision(this, content, timestamp || new Date());
+ var revision = new WebInspector.Revision(this, content, timestamp || new Date());
this.history.push(revision);
this.dispatchEventToListeners(WebInspector.Resource.Events.RevisionAdded, revision);
if (!restoringHistory)
- revision._persistRevision();
+ revision._persist();
WebInspector.resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceContentCommitted, { resource: this, content: content });
},
+ _restoreRevisionHistory: function()
+ {
+ if (!window.localStorage)
+ return;
+
+ WebInspector.Revision._ensureStaleRevisionsFileteredOut();
+ var registry = WebInspector.Revision._revisionHistoryRegistry();
+ var historyItems = registry[this.url];
+ for (var i = 0; historyItems && i < historyItems.length; ++i)
+ this.addRevision(window.localStorage[historyItems[i].key], new Date(historyItems[i].timestamp), true);
+ },
+
+ _clearRevisionHistory: function()
+ {
+ if (!window.localStorage)
+ return;
+
+ var registry = WebInspector.Revision._revisionHistoryRegistry();
+ var historyItems = registry[this.url];
+ for (var i = 0; historyItems && i < historyItems.length; ++i)
+ delete window.localStorage[historyItems[i].key];
+ delete registry[this.url];
+ window.localStorage["revision-history"] = JSON.stringify(registry);
+ },
+
/**
* @return {?string}
*/
@@ -484,7 +409,7 @@
function clearHistory()
{
- WebInspector.Resource._clearResourceHistory(this);
+ this._clearRevisionHistory();
this.history = [];
callback();
}
@@ -526,14 +451,64 @@
* @param {?string|undefined} content
* @param {Date} timestamp
*/
-WebInspector.ResourceRevision = function(resource, content, timestamp)
+WebInspector.Revision = function(resource, content, timestamp)
{
this._resource = resource;
this._content = content;
this._timestamp = timestamp;
}
-WebInspector.ResourceRevision.prototype = {
+WebInspector.Revision._revisionHistoryRegistry = function()
+{
+ if (!WebInspector.Revision._revisionHistoryRegistryObject) {
+ if (window.localStorage) {
+ var revisionHistory = window.localStorage["revision-history"];
+ try {
+ WebInspector.Revision._revisionHistoryRegistryObject = revisionHistory ? JSON.parse(revisionHistory) : {};
+ } catch (e) {
+ WebInspector.Revision._revisionHistoryRegistryObject = {};
+ }
+ } else
+ WebInspector.Revision._revisionHistoryRegistryObject = {};
+ }
+ return WebInspector.Revision._revisionHistoryRegistryObject;
+}
+
+WebInspector.Revision._ensureStaleRevisionsFileteredOut = function()
+{
+ if (!window.localStorage)
+ return;
+
+ if (WebInspector.Revision._staleRevisionsFilteredOut)
+ return;
+ WebInspector.Revision._staleRevisionsFilteredOut = true;
+
+ var registry = WebInspector.Revision._revisionHistoryRegistry();
+ var filteredRegistry = {};
+ for (var url in registry) {
+ var historyItems = registry[url];
+ var filteredHistoryItems = [];
+ for (var i = 0; historyItems && i < historyItems.length; ++i) {
+ var historyItem = historyItems[i];
+ if (historyItem.loaderId === WebInspector.resourceTreeModel.mainFrame.loaderId) {
+ filteredHistoryItems.push(historyItem);
+ filteredRegistry[url] = filteredHistoryItems;
+ } else
+ delete window.localStorage[historyItem.key];
+ }
+ }
+ WebInspector.Revision._revisionHistoryRegistryObject = filteredRegistry;
+
+ function persist()
+ {
+ window.localStorage["revision-history"] = JSON.stringify(filteredRegistry);
+ }
+
+ // Schedule async storage.
+ setTimeout(persist, 0);
+}
+
+WebInspector.Revision.prototype = {
/**
* @return {WebInspector.Resource}
*/
@@ -603,8 +578,35 @@
callback([]);
},
- _persistRevision: function()
+ _persist: function()
{
- WebInspector.Resource.persistRevision(this);
+ if (!window.localStorage)
+ return;
+
+ var url = ""
+ if (url.startsWith("inspector://"))
+ return;
+
+ var loaderId = WebInspector.resourceTreeModel.mainFrame.loaderId;
+ var timestamp = this.timestamp.getTime();
+ var key = "revision-history|" + url + "|" + loaderId + "|" + timestamp;
+
+ var registry = WebInspector.Revision._revisionHistoryRegistry();
+
+ var historyItems = registry[url];
+ if (!historyItems) {
+ historyItems = [];
+ registry[url] = historyItems;
+ }
+ historyItems.push({url: url, loaderId: loaderId, timestamp: timestamp, key: key});
+
+ function persist()
+ {
+ window.localStorage[key] = this._content;
+ window.localStorage["revision-history"] = JSON.stringify(registry);
+ }
+
+ // Schedule async storage.
+ setTimeout(persist.bind(this), 0);
}
}
Modified: trunk/Source/WebCore/inspector/front-end/ResourceTreeModel.js (122228 => 122229)
--- trunk/Source/WebCore/inspector/front-end/ResourceTreeModel.js 2012-07-10 16:18:40 UTC (rev 122228)
+++ trunk/Source/WebCore/inspector/front-end/ResourceTreeModel.js 2012-07-10 16:23:09 UTC (rev 122229)
@@ -93,8 +93,6 @@
this._addFramesRecursively(null, mainFramePayload);
this._dispatchInspectedURLChanged();
this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded);
- WebInspector.Resource.restoreRevisions();
-
this._cachedResourcesProcessed = true;
},
@@ -334,23 +332,16 @@
{
var framePayload = frameTreePayload.frame;
var frame = new WebInspector.ResourceTreeFrame(this, parentFrame, framePayload);
+ this._addFrame(frame);
- // Create frame resource.
var frameResource = this._createResourceFromFramePayload(framePayload, framePayload.url, WebInspector.resourceTypes.Document, framePayload.mimeType);
-
if (frame.isMainFrame())
WebInspector.inspectedPageURL = frameResource.url;
-
- this._addFrame(frame);
frame.addResource(frameResource);
for (var i = 0; frameTreePayload.childFrames && i < frameTreePayload.childFrames.length; ++i)
this._addFramesRecursively(frame, frameTreePayload.childFrames[i]);
- if (!frameTreePayload.resources)
- return;
-
- // Create frame subresources.
for (var i = 0; i < frameTreePayload.resources.length; ++i) {
var subresource = frameTreePayload.resources[i];
var resource = this._createResourceFromFramePayload(framePayload, subresource.url, WebInspector.resourceTypes[subresource.type], subresource.mimeType);
Modified: trunk/Source/WebCore/inspector/front-end/RevisionHistoryView.js (122228 => 122229)
--- trunk/Source/WebCore/inspector/front-end/RevisionHistoryView.js 2012-07-10 16:18:40 UTC (rev 122228)
+++ trunk/Source/WebCore/inspector/front-end/RevisionHistoryView.js 2012-07-10 16:23:09 UTC (rev 122229)
@@ -174,8 +174,8 @@
/**
* @constructor
* @extends {TreeElement}
- * @param {WebInspector.ResourceRevision} revision
- * @param {WebInspector.ResourceRevision} baseRevision
+ * @param {WebInspector.Revision} revision
+ * @param {WebInspector.Revision} baseRevision
* @param {boolean} allowRevert
*/
WebInspector.RevisionHistoryTreeElement = function(revision, baseRevision, allowRevert)
Modified: trunk/Source/WebCore/inspector/front-end/UISourceCode.js (122228 => 122229)
--- trunk/Source/WebCore/inspector/front-end/UISourceCode.js 2012-07-10 16:18:40 UTC (rev 122228)
+++ trunk/Source/WebCore/inspector/front-end/UISourceCode.js 2012-07-10 16:23:09 UTC (rev 122229)
@@ -138,7 +138,7 @@
_revisionAdded: function(event)
{
- var revision = /** @type {WebInspector.ResourceRevision} */ event.data;
+ var revision = /** @type {WebInspector.Revision} */ event.data;
this.contentChanged(revision.content || "", this._resource.canonicalMimeType());
},