Changeset 93605 in webkit


Ignore:
Timestamp:
Aug 23, 2011 8:35:58 AM (13 years ago)
Author:
caseq@chromium.org
Message:

Web Inspector: [Extensions API] provide access to page resources
https://bugs.webkit.org/show_bug.cgi?id=66767

Reviewed by Pavel Feldman.

Source/WebCore:

Test: inspector/extensions/extensions-resources.html

  • inspector/front-end/ExtensionAPI.js:

(WebInspector.injectedExtensionAPI.EventSinkImpl.prototype.addListener):
(WebInspector.injectedExtensionAPI):
(WebInspector.injectedExtensionAPI.RequestImpl.prototype.getContent):
(WebInspector.injectedExtensionAPI.InspectedWindow.resourceDispatch):
(WebInspector.injectedExtensionAPI.InspectedWindow.resourceContentDispatch):
(WebInspector.injectedExtensionAPI.InspectedWindow):
(WebInspector.injectedExtensionAPI.InspectedWindow.prototype.eval):
(WebInspector.injectedExtensionAPI.InspectedWindow.prototype.getResources):
(WebInspector.injectedExtensionAPI.InspectedWindow.prototype.getResources.callbackWrapper):
(WebInspector.injectedExtensionAPI.ResourceImpl.prototype.get url):
(WebInspector.injectedExtensionAPI.ResourceImpl.prototype.get type):
(WebInspector.injectedExtensionAPI.ResourceImpl.prototype.getContent):
(WebInspector.injectedExtensionAPI.ResourceImpl.prototype.setContent):

  • inspector/front-end/ExtensionServer.js:

(WebInspector.ExtensionServer):
(WebInspector.ExtensionServer.prototype._notifyResourceAdded):
(WebInspector.ExtensionServer.prototype.notifyResourceContentCommitted):
(WebInspector.ExtensionServer.prototype._makeResource):
(WebInspector.ExtensionServer.prototype._onGetPageResources):
(WebInspector.ExtensionServer.prototype._getResourceContent):
(WebInspector.ExtensionServer.prototype._onGetRequestContent):
(WebInspector.ExtensionServer.prototype._onGetResourceContent):
(WebInspector.ExtensionServer.prototype._onSetResourceContent):
(WebInspector.ExtensionServer.prototype.initExtensions):

  • inspector/front-end/Resource.js:

(WebInspector.Resource.prototype.addRevision):

LayoutTests:

  • http/tests/inspector/resources/extension-main.js:

(trimURL):

  • inspector/extensions/extensions-api-expected.txt:
  • inspector/extensions/extensions-network-expected.txt:
  • inspector/extensions/extensions-network.html:
  • inspector/extensions/extensions-resources-expected.txt: Added.
  • inspector/extensions/extensions-resources.html: Added.
  • inspector/extensions/resources/Ahem.ttf:
  • inspector/extensions/resources/test-script.js: Added.

(test_function):

Location:
trunk
Files:
3 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r93598 r93605  
     12011-08-23  Andrey Kosyakov  <caseq@chromium.org>
     2
     3        Web Inspector: [Extensions API] provide access to page resources
     4        https://bugs.webkit.org/show_bug.cgi?id=66767
     5
     6        Reviewed by Pavel Feldman.
     7
     8        * http/tests/inspector/resources/extension-main.js:
     9        (trimURL):
     10        * inspector/extensions/extensions-api-expected.txt:
     11        * inspector/extensions/extensions-network-expected.txt:
     12        * inspector/extensions/extensions-network.html:
     13        * inspector/extensions/extensions-resources-expected.txt: Added.
     14        * inspector/extensions/extensions-resources.html: Added.
     15        * inspector/extensions/resources/Ahem.ttf:
     16        * inspector/extensions/resources/test-script.js: Added.
     17        (__test_function):
     18
    1192011-08-23  Csaba Osztrogonác  <ossy@webkit.org>
    220
  • trunk/LayoutTests/http/tests/inspector/resources/extension-main.js

    r89659 r93605  
     1function trimURL(url)
     2{
     3    if (/^data:/.test(url))
     4        return url.replace(/;.*$/, "...");
     5    return url.replace(/.*\//, ".../");
     6}
     7
    18function dumpObject(object, nondeterministicProps, prefix, firstLinePrefix)
    29{
     
    714        var prefixWithName = prefix + "    " + prop + " : ";
    815        var propValue = object[prop];
    9         if (nondeterministicProps && prop in nondeterministicProps)
    10             output(prefixWithName + "<" + typeof propValue + ">");
    11         else if (propValue === null)
     16        if (nondeterministicProps && prop in nondeterministicProps) {
     17            var value = nondeterministicProps[prop] === "url" ? trimURL(propValue) : "<" + typeof propValue + ">";
     18            output(prefixWithName + value);
     19        } else if (propValue === null)
    1220            output(prefixWithName + "null");
    1321        else if (typeof propValue === "object")
  • trunk/LayoutTests/inspector/extensions/extensions-api-expected.txt

    r93312 r93605  
    99    }
    1010    inspectedWindow : {
     11        onResourceAdded : {
     12            addListener : <function>
     13            removeListener : <function>
     14        }
     15        onResourceContentCommitted : {
     16            addListener : <function>
     17            removeListener : <function>
     18        }
    1119        reload : <function>
    1220        eval : <function>
     21        getResources : <function>
    1322    }
    1423    panels : {
     
    4352            removeListener : <function>
    4453        }
    45         onContentEdited : {
    46             addListener : <function>
    47             removeListener : <function>
    48         }
    4954        getHAR : <function>
    5055        addRequestHeaders : <function>
     
    6065        }
    6166        onNavigated : {
    62             addListener : <function>
    63             removeListener : <function>
    64         }
    65         onContentEdited : {
    6667            addListener : <function>
    6768            removeListener : <function>
  • trunk/LayoutTests/inspector/extensions/extensions-network-expected.txt

    r93312 r93605  
    2929RUNNING TEST: extension_testRequestNotification
    3030Request finished: .../inspector/extensions/extensions-network.html
    31 RUNNING TEST: extension_testResourceContentEdited
    32 content for resource .../extensions/resources/audits-style1.css edited: body { background-color: black; }
    3331All tests done.
    3432
  • trunk/LayoutTests/inspector/extensions/extensions-network.html

    r93312 r93605  
    7777}
    7878
    79 function extension_testResourceContentEdited(nextTest)
    80 {
    81     function onContentEdited(url, content)
    82     {
    83         webInspector.network.onContentEdited.removeListener(onContentEdited);
    84         var urlTail = url.replace(/.*((\/[^/]*){3}$)/,"...$1");
    85         output("content for resource " + urlTail + " edited: " + content);
    86         nextTest();
    87     }   
    88     webInspector.network.onContentEdited.addListener(onContentEdited);
    89 
    90     function findAndEditResource()
    91     {
    92         var resources = WebInspector.networkLog.resources;
    93         for (var i = 0; i < resources.length; ++i) {
    94             if (/audits-style1.css$/.test(resources[i].url)) {
    95                 resources[i].setContent("body { background-color: black; }", true);
    96                 break;
    97             }
    98         }
    99     }
    100     evaluateOnFrontend("(" + findAndEditResource + ")()");
    101 }
    102 
    10379var test = function()
    10480{
  • trunk/LayoutTests/inspector/extensions/resources/Ahem.ttf

    • Property svn:executable deleted
  • trunk/Source/WebCore/ChangeLog

    r93604 r93605  
     12011-08-23  Andrey Kosyakov  <caseq@chromium.org>
     2
     3        Web Inspector: [Extensions API] provide access to page resources
     4        https://bugs.webkit.org/show_bug.cgi?id=66767
     5
     6        Reviewed by Pavel Feldman.
     7
     8        Test: inspector/extensions/extensions-resources.html
     9
     10        * inspector/front-end/ExtensionAPI.js:
     11        (WebInspector.injectedExtensionAPI.EventSinkImpl.prototype.addListener):
     12        (WebInspector.injectedExtensionAPI):
     13        (WebInspector.injectedExtensionAPI.RequestImpl.prototype.getContent):
     14        (WebInspector.injectedExtensionAPI.InspectedWindow.resourceDispatch):
     15        (WebInspector.injectedExtensionAPI.InspectedWindow.resourceContentDispatch):
     16        (WebInspector.injectedExtensionAPI.InspectedWindow):
     17        (WebInspector.injectedExtensionAPI.InspectedWindow.prototype.eval):
     18        (WebInspector.injectedExtensionAPI.InspectedWindow.prototype.getResources):
     19        (WebInspector.injectedExtensionAPI.InspectedWindow.prototype.getResources.callbackWrapper):
     20        (WebInspector.injectedExtensionAPI.ResourceImpl.prototype.get url):
     21        (WebInspector.injectedExtensionAPI.ResourceImpl.prototype.get type):
     22        (WebInspector.injectedExtensionAPI.ResourceImpl.prototype.getContent):
     23        (WebInspector.injectedExtensionAPI.ResourceImpl.prototype.setContent):
     24        * inspector/front-end/ExtensionServer.js:
     25        (WebInspector.ExtensionServer):
     26        (WebInspector.ExtensionServer.prototype._notifyResourceAdded):
     27        (WebInspector.ExtensionServer.prototype.notifyResourceContentCommitted):
     28        (WebInspector.ExtensionServer.prototype._makeResource):
     29        (WebInspector.ExtensionServer.prototype._onGetPageResources):
     30        (WebInspector.ExtensionServer.prototype._getResourceContent):
     31        (WebInspector.ExtensionServer.prototype._onGetRequestContent):
     32        (WebInspector.ExtensionServer.prototype._onGetResourceContent):
     33        (WebInspector.ExtensionServer.prototype._onSetResourceContent):
     34        (WebInspector.ExtensionServer.prototype.initExtensions):
     35        * inspector/front-end/Resource.js:
     36        (WebInspector.Resource.prototype.addRevision):
     37
    1382011-08-23  Pavel Feldman  <pfeldman@google.com>
    239
  • trunk/Source/WebCore/inspector/front-end/ExtensionAPI.js

    r93312 r93605  
    4949    {
    5050        if (typeof callback != "function")
    51             throw new "addListener: callback is not a function";
     51            throw "addListener: callback is not a function";
    5252        if (this._listeners.length === 0)
    5353            extensionServer.sendRequest({ command: "subscribe", type: this._type });
     
    116116    defineDeprecatedProperty(this, "network", "onFinished", "onRequestFinished");
    117117    this.onNavigated = new EventSink("inspectedURLChanged");
    118     this.onContentEdited = new EventSink("resource-content-edited");
    119118}
    120119
     
    152151            callback(response.content, response.encoding);
    153152        }
    154         extensionServer.sendRequest({ command: "getResourceContent", id: this._id }, callback && callbackWrapper);
     153        extensionServer.sendRequest({ command: "getRequestContent", id: this._id }, callback && callbackWrapper);
    155154    }
    156155};
     
    359358function InspectedWindow()
    360359{
     360    function resourceDispatch(message)
     361    {
     362        this._fire(new Resource(message.arguments[0]));
     363    }
     364    function resourceContentDispatch(message)
     365    {
     366        this._fire(new Resource(message.arguments[0]), message.arguments[1]);
     367    }
     368    this.onResourceAdded = new EventSink("resource-added", resourceDispatch);
     369    this.onResourceContentCommitted = new EventSink("resource-content-committed", resourceContentDispatch);
    361370}
    362371
     
    377386        }
    378387        return extensionServer.sendRequest({ command: "evaluateOnInspectedPage", expression: expression }, callback && callbackWrapper);
    379     }
    380 }
     388    },
     389
     390    getResources: function(callback)
     391    {
     392        function wrapResource(resourceData)
     393        {
     394            return new Resource(resourceData);
     395        }
     396        function callbackWrapper(resources)
     397        {
     398            callback(resources.map(wrapResource));
     399        }
     400        return extensionServer.sendRequest({ command: "getPageResources" }, callback && callbackWrapper);
     401    }
     402}
     403
     404function ResourceImpl(resourceData)
     405{
     406    this._url = resourceData.url
     407    this._type = resourceData.type;
     408}
     409
     410ResourceImpl.prototype = {
     411    get url()
     412    {
     413        return this._url;
     414    },
     415
     416    get type()
     417    {
     418        return this._type;
     419    },
     420
     421    getContent: function(callback)
     422    {
     423        function callbackWrapper(response)
     424        {
     425            callback(response.content, response.encoding);
     426        }
     427
     428        return extensionServer.sendRequest({ command: "getResourceContent", url: this._url }, callback && callbackWrapper);
     429    },
     430
     431    setContent: function(content, commit, callback)
     432    {
     433        return extensionServer.sendRequest({ command: "setResourceContent", url: this._url, content: content, commit: commit }, callback);
     434    }
     435};
    381436
    382437function TimelineImpl()
     
    456511        if (member.charAt(0) === "_")
    457512            continue;
    458         var value = implementation[member];
    459         interface[member] = typeof value === "function" ? bind(value, implementation)
    460             : interface[member] = implementation[member];
     513        var descriptor = null;
     514        // Traverse prototype chain until we find the owner.
     515        for (var owner = implementation; owner && !descriptor; owner = owner.__proto__)
     516            descriptor = Object.getOwnPropertyDescriptor(owner, member);
     517        if (!descriptor)
     518            continue;
     519        if (typeof descriptor.value === "function")
     520            interface[member] = bind(descriptor.value, implementation);
     521        else if (typeof descriptor.get === "function")
     522            interface.__defineGetter__(member, bind(descriptor.get, implementation));
     523        else
     524            Object.defineProperty(interface, member, descriptor);
    461525    }
    462526}
     
    493557var PanelWithSidebar = declareInterfaceClass(PanelWithSidebarImpl);
    494558var Request = declareInterfaceClass(RequestImpl);
     559var Resource = declareInterfaceClass(ResourceImpl);
    495560var Timeline = declareInterfaceClass(TimelineImpl);
    496561
  • trunk/Source/WebCore/inspector/front-end/ExtensionServer.js

    r93312 r93605  
    4949    this._registerHandler("evaluateOnInspectedPage", this._onEvaluateOnInspectedPage.bind(this));
    5050    this._registerHandler("getHAR", this._onGetHAR.bind(this));
     51    this._registerHandler("getPageResources", this._onGetPageResources.bind(this));
     52    this._registerHandler("getRequestContent", this._onGetRequestContent.bind(this));
    5153    this._registerHandler("getResourceContent", this._onGetResourceContent.bind(this));
    5254    this._registerHandler("log", this._onLog.bind(this));
    5355    this._registerHandler("reload", this._onReload.bind(this));
     56    this._registerHandler("setResourceContent", this._onSetResourceContent.bind(this));
    5457    this._registerHandler("setSidebarHeight", this._onSetSidebarHeight.bind(this));
    5558    this._registerHandler("setSidebarContent", this._onSetSidebarContent.bind(this));
     
    118121    },
    119122
    120     notifyResourceContentEdited: function(url, content)
    121     {
    122         this._postNotification("resource-content-edited", url, content);
     123    _notifyResourceAdded: function(event)
     124    {
     125        var resource = event.data;
     126        this._postNotification("resource-added", this._makeResource(resource));
     127    },
     128
     129    notifyResourceContentCommitted: function(resource, content)
     130    {
     131        this._postNotification("resource-content-committed", this._makeResource(resource), content);
    123132    },
    124133
     
    311320    },
    312321
    313     _onGetResourceContent: function(message, port)
     322    _makeResource: function(resource)
     323    {
     324        return {
     325            url: resource.url,
     326            type: WebInspector.Resource.Type.toString(resource.type)
     327        };
     328    },
     329
     330    _onGetPageResources: function()
     331    {
     332        var resources = [];
     333        function pushResourceData(resource)
     334        {
     335            resources.push(this._makeResource(resource));
     336        }
     337        WebInspector.resourceTreeModel.forAllResources(pushResourceData.bind(this));
     338        return resources;
     339    },
     340
     341    _getResourceContent: function(resource, message, port)
    314342    {
    315343        function onContentAvailable(content, encoded)
     
    321349            this._dispatchCallback(message.requestId, port, response);
    322350        }
     351        resource.requestContent(onContentAvailable.bind(this));
     352    },
     353
     354    _onGetRequestContent: function(message, port)
     355    {
    323356        var request = this._requestById(message.id);
    324357        if (!request)
    325358            return this._status.E_NOTFOUND(message.id);
    326         request.requestContent(onContentAvailable.bind(this));
     359        this._getResourceContent(request, message, port);
     360    },
     361
     362    _onGetResourceContent: function(message, port)
     363    {
     364        var resource = WebInspector.resourceTreeModel.resourceForURL(message.url);
     365        if (!resource)
     366            return this._status.E_NOTFOUND(message.url);
     367        this._getResourceContent(resource, message, port);
     368    },
     369
     370    _onSetResourceContent: function(message, port)
     371    {
     372        function callbackWrapper(error)
     373        {
     374            var response = error ? this._status.E_FAILED(error) : this._status.OK();
     375            this._dispatchCallback(message.requestId, port, response);
     376        }
     377        var resource = WebInspector.resourceTreeModel.resourceForURL(message.url);
     378        if (!resource)
     379            return this._status.E_NOTFOUND(message.url);
     380        resource.setContent(message.content, message.commit, callbackWrapper.bind(this));
    327381    },
    328382
     
    376430        WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceFinished, this._notifyRequestFinished, this);
    377431        WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged, this._inspectedURLChanged, this);
     432        WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, this._notifyResourceAdded, this);
    378433        WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded, this._addRecordToTimeline, this);
    379434
     
    502557    E_NOTFOUND: "Object not found: %s",
    503558    E_NOTSUPPORTED: "Object does not support requested operation: %s",
     559    E_FAILED: "Operation failed: %s"
    504560}
    505561
  • trunk/Source/WebCore/inspector/front-end/Resource.js

    r92953 r93605  
    834834        if (!restoringHistory)
    835835            this._persistRevision();
    836         WebInspector.extensionServer.notifyResourceContentEdited(this.url, newContent);
     836        WebInspector.extensionServer.notifyResourceContentCommitted(this, newContent);
    837837    },
    838838
Note: See TracChangeset for help on using the changeset viewer.