Changeset 140142 in webkit


Ignore:
Timestamp:
Jan 18, 2013 7:12:17 AM (11 years ago)
Author:
aandrey@chromium.org
Message:

Web Inspector: [Canvas] introduce Resource.toDataURL
https://bugs.webkit.org/show_bug.cgi?id=107019

Reviewed by Pavel Feldman.

Resource.toDataURL will return string data url representation of a resource, if applicable.
For example, for a rendering context resource (2D or WebGL) it will return canvas.toDataURL().

  • inspector/InjectedScriptCanvasModuleSource.js:

(.):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r140140 r140142  
     12013-01-18  Andrey Adaikin  <aandrey@chromium.org>
     2
     3        Web Inspector: [Canvas] introduce Resource.toDataURL
     4        https://bugs.webkit.org/show_bug.cgi?id=107019
     5
     6        Reviewed by Pavel Feldman.
     7
     8        Resource.toDataURL will return string data url representation of a resource, if applicable.
     9        For example, for a rendering context resource (2D or WebGL) it will return canvas.toDataURL().
     10
     11        * inspector/InjectedScriptCanvasModuleSource.js:
     12        (.):
     13
    1142013-01-18  Csaba Osztrogonác  <ossy@webkit.org>
    215
  • trunk/Source/WebCore/inspector/InjectedScriptCanvasModuleSource.js

    r139729 r140142  
    9393            // FIXME: Maybe this is a bug in WebKit core?
    9494            if (/^blob:/.test(img.src))
    95                 return TypeUtils.cloneIntoCanvas(img, img.width, img.height);
     95                return TypeUtils.cloneIntoCanvas(img);
    9696            return img.cloneNode(true);
    9797        }
    9898
    9999        if (obj instanceof HTMLCanvasElement)
    100             return TypeUtils.cloneIntoCanvas(obj, obj.width, obj.height);
     100            return TypeUtils.cloneIntoCanvas(obj);
    101101
    102102        if (obj instanceof HTMLVideoElement)
     
    118118    /**
    119119     * @param {HTMLImageElement|HTMLCanvasElement|HTMLVideoElement} obj
    120      * @param {number} width
    121      * @param {number} height
     120     * @param {number=} width
     121     * @param {number=} height
    122122     * @return {HTMLCanvasElement}
    123123     */
     
    125125    {
    126126        var canvas = /** @type {HTMLCanvasElement} */ (inspectedWindow.document.createElement("canvas"));
    127         canvas.width = width;
    128         canvas.height = height;
     127        canvas.width = width || +obj.width;
     128        canvas.height = height || +obj.height;
    129129        var context = /** @type {CanvasRenderingContext2D} */ (Resource.wrappedObject(canvas.getContext("2d")));
    130130        context.drawImage(obj, 0, 0);
     
    735735        console.assert(result, "Failed to find context resource for " + this._name + "@" + this._kindId);
    736736        return result;
     737    },
     738
     739    /**
     740     * @return {string}
     741     */
     742    toDataURL: function()
     743    {
     744        var contextResource = this.contextResource();
     745        return contextResource === this ? "" : contextResource.toDataURL();
    737746    },
    738747
     
    16001609 * @extends {ContextResource}
    16011610 * @param {!WebGLRenderingContext} glContext
    1602  * @param {function():WebGLRenderingContext} replayContextCallback
    1603  */
    1604 function WebGLRenderingContextResource(glContext, replayContextCallback)
     1611 */
     1612function WebGLRenderingContextResource(glContext)
    16051613{
    16061614    ContextResource.call(this, glContext, "WebGLRenderingContext");
    1607     this._replayContextCallback = replayContextCallback;
    16081615    /** @type {Object.<number, boolean>} */
    16091616    this._customErrors = null;
     
    17201727
    17211728    /**
     1729     * @override
     1730     * @return {string}
     1731     */
     1732    toDataURL: function()
     1733    {
     1734        return this.wrappedObject().canvas.toDataURL();
     1735    },
     1736
     1737    /**
    17221738     * @return {Array.<number>}
    17231739     */
     
    18091825    {
    18101826        var gl = this.wrappedObject();
    1811         data.replayContextCallback = this._replayContextCallback;
     1827        data.originalCanvas = gl.canvas;
     1828        data.originalContextAttributes = gl.getContextAttributes();
    18121829        data.extensions = TypeUtils.cloneObject(this._extensions);
    18131830
     
    18641881    _doReplayCalls: function(data, cache)
    18651882    {
    1866         this._replayContextCallback = data.replayContextCallback;
    18671883        this._customErrors = null;
    18681884        this._extensions = TypeUtils.cloneObject(data.extensions) || {};
    18691885
    1870         var gl = /** @type {!WebGLRenderingContext} */ (Resource.wrappedObject(this._replayContextCallback()));
     1886        var canvas = data.originalCanvas.cloneNode(true);
     1887        var replayContext = null;
     1888        var contextIds = ["experimental-webgl", "webkit-3d", "3d"];
     1889        for (var i = 0, contextId; contextId = contextIds[i]; ++i) {
     1890            replayContext = canvas.getContext(contextId, data.originalContextAttributes);
     1891            if (replayContext)
     1892                break;
     1893        }
     1894
     1895        var gl = /** @type {!WebGLRenderingContext} */ (Resource.wrappedObject(replayContext));
    18711896        this.setWrappedObject(gl);
    18721897
     
    21872212 * @extends {ContextResource}
    21882213 * @param {!CanvasRenderingContext2D} context
    2189  * @param {function():CanvasRenderingContext2D} replayContextCallback
    2190  */
    2191 function CanvasRenderingContext2DResource(context, replayContextCallback)
     2214 */
     2215function CanvasRenderingContext2DResource(context)
    21922216{
    21932217    ContextResource.call(this, context, "CanvasRenderingContext2D");
    2194     this._replayContextCallback = replayContextCallback;
    21952218}
    21962219
     
    22612284    /**
    22622285     * @override
    2263      * @param {!Object} data
    2264      * @param {!Cache} cache
    2265      */
    2266     _populateReplayableData: function(data, cache)
    2267     {
    2268         data.replayContextCallback = this._replayContextCallback;
    2269         data.currentAttributes = this._currentAttributesState();
    2270         var ctx = this.wrappedObject();
    2271         try {
    2272             data.originalImageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
    2273         } catch (e) {
    2274             console.error("ASSERT_NOT_REACHED: getImageData failed.", e);
    2275         }
     2286     * @return {string}
     2287     */
     2288    toDataURL: function()
     2289    {
     2290        return this.wrappedObject().canvas.toDataURL();
    22762291    },
    22772292
     
    22812296     * @param {!Cache} cache
    22822297     */
     2298    _populateReplayableData: function(data, cache)
     2299    {
     2300        data.currentAttributes = this._currentAttributesState();
     2301        data.originalCanvasCloned = TypeUtils.cloneIntoCanvas(this.wrappedObject().canvas);
     2302    },
     2303
     2304    /**
     2305     * @override
     2306     * @param {!Object} data
     2307     * @param {!Cache} cache
     2308     */
    22832309    _doReplayCalls: function(data, cache)
    22842310    {
    2285         this._replayContextCallback = data.replayContextCallback;
    2286 
    2287         var ctx = /** @type {!CanvasRenderingContext2D} */ (Resource.wrappedObject(this._replayContextCallback()));
     2311        var canvas = TypeUtils.cloneIntoCanvas(data.originalCanvasCloned);
     2312        var ctx = /** @type {!CanvasRenderingContext2D} */ (Resource.wrappedObject(canvas.getContext("2d")));
    22882313        this.setWrappedObject(ctx);
    22892314
    2290         if (data.originalImageData) {
    2291             try {
    2292                 ctx.putImageData(data.originalImageData, 0, 0);
    2293             } catch (e) {
    2294                 console.error("ASSERT_NOT_REACHED: putImageData failed.", e);
    2295             }
    2296         }
    2297 
    22982315        for (var i = 0, n = data.calls.length; i < n; ++i) {
    2299             var replayableCall = data.calls[i];
     2316            var replayableCall = /** @type {ReplayableCall} */ (data.calls[i]);
    23002317            if (replayableCall.functionName() === "save")
    23012318                this._applyAttributesState(replayableCall.attachment("canvas2dAttributesState"));
     
    26102627 * @constructor
    26112628 * @param {!TraceLog} traceLog
    2612  * @param {function()=} resetCallback
    2613  */
    2614 function TraceLogPlayer(traceLog, resetCallback)
     2629 */
     2630function TraceLogPlayer(traceLog)
    26152631{
    26162632    /** @type {!TraceLog} */
     
    26202636    /** @type {!Cache} */
    26212637    this._replayWorldCache = new Cache();
    2622     /** @type {function()|undefined} */
    2623     this._resetCallback = resetCallback;
    26242638}
    26252639
     
    26452659        this._nextReplayStep = 0;
    26462660        this._replayWorldCache.reset();
    2647         if (this._resetCallback)
    2648             this._resetCallback();
    26492661    },
    26502662
     
    28002812    /** @type {!Object.<string, TraceLog>} */
    28012813    this._traceLogs = {};
    2802     /** @type {TraceLogPlayer} */
    2803     this._traceLogPlayer = null;
    2804     /** @type {!Array.<{type: string, context: Object}>} */
    2805     this._replayContexts = [];
     2814    /** @type {!Object.<string, TraceLogPlayer>} */
     2815    this._traceLogPlayers = {};
    28062816}
    28072817
     
    28132823    wrapWebGLContext: function(glContext)
    28142824    {
    2815         var resource = Resource.forObject(glContext) || new WebGLRenderingContextResource(glContext, this._constructWebGLReplayContext.bind(this, glContext));
     2825        var resource = Resource.forObject(glContext) || new WebGLRenderingContextResource(glContext);
    28162826        this._manager.registerResource(resource);
    28172827        return resource.proxyObject();
     
    28242834    wrapCanvas2DContext: function(context)
    28252835    {
    2826         var resource = Resource.forObject(context) || new CanvasRenderingContext2DResource(context, this._constructCanvas2DReplayContext.bind(this, context));
     2836        var resource = Resource.forObject(context) || new CanvasRenderingContext2DResource(context);
    28272837        this._manager.registerResource(resource);
    28282838        return resource.proxyObject();
     
    28812891    {
    28822892        this.stopCapturing(id);
    2883         if (this._traceLogPlayer && this._traceLogPlayer.traceLog() === this._traceLogs[id]) {
    2884             this._traceLogPlayer = null;
    2885             this._replayContexts = [];
    2886         }
    28872893        delete this._traceLogs[id];
     2894        delete this._traceLogPlayers[id];
    28882895    },
    28892896
     
    29552962        if (!traceLog)
    29562963            return "";
    2957         if (!this._traceLogPlayer || this._traceLogPlayer.traceLog() !== traceLog) {
    2958             this._replayContexts = [];
    2959             this._traceLogPlayer = new TraceLogPlayer(traceLog, this._onTraceLogPlayerReset.bind(this));
    2960         }
    2961         var lastCall = this._traceLogPlayer.stepTo(stepNo);
    2962         if (!this._replayContexts.length) {
    2963             console.error("ASSERT_NOT_REACHED: replayTraceLog failed to create a replay canvas?!");
    2964             return "";
    2965         }
    2966         // FIXME: Support replaying several canvases simultaneously.
    2967         var lastCallResourceContext = Resource.wrappedObject(lastCall.resource());
    2968         for (var i = 0, n = this._replayContexts.length; i < n; ++i) {
    2969             var context = this._replayContexts[i].context;
    2970             if (lastCallResourceContext === context)
    2971                 return context.canvas.toDataURL();
    2972         }
    2973         console.assert("ASSERT_NOT_REACHED: replayTraceLog failed to match the replaying canvas?!");
    2974         return this._replayContexts[0].context.canvas.toDataURL();
     2964        this._traceLogPlayers[id] = this._traceLogPlayers[id] || new TraceLogPlayer(traceLog);
     2965        var lastCall = this._traceLogPlayers[id].stepTo(stepNo);
     2966        return lastCall.resource().toDataURL();
    29752967    },
    29762968
     
    29902982    {
    29912983        return "{\"injectedScriptId\":" + injectedScriptId + ",\"canvasContextId\":" + resourceId + "}";
    2992     },
    2993 
    2994     _onTraceLogPlayerReset: function()
    2995     {
    2996         this._replayContexts = [];
    2997     },
    2998 
    2999     /**
    3000      * @param {!WebGLRenderingContext} originalGlContext
    3001      * @return {WebGLRenderingContext}
    3002      */
    3003     _constructWebGLReplayContext: function(originalGlContext)
    3004     {
    3005         var canvas = originalGlContext.canvas.cloneNode(true);
    3006         var attributes = originalGlContext.getContextAttributes();
    3007         var contextIds = ["experimental-webgl", "webkit-3d", "3d"];
    3008         for (var i = 0, contextId; contextId = contextIds[i]; ++i) {
    3009             var replayContext = canvas.getContext(contextId, attributes);
    3010             if (replayContext) {
    3011                 replayContext = /** @type {WebGLRenderingContext} */ (Resource.wrappedObject(replayContext));
    3012                 this._replayContexts.push({
    3013                     type: "3d",
    3014                     context: replayContext
    3015                 });
    3016                 return replayContext;
    3017             }
    3018         }
    3019         return null;
    3020     },
    3021 
    3022     /**
    3023      * @param {!CanvasRenderingContext2D} originalContext
    3024      * @return {CanvasRenderingContext2D}
    3025      */
    3026     _constructCanvas2DReplayContext: function(originalContext)
    3027     {
    3028         // Create a new 2D context each time to start with an empty context drawing state stack (managed by save() and restore() methods).
    3029         var canvas = originalContext.canvas.cloneNode(true);
    3030         var replayContext = /** @type {CanvasRenderingContext2D} */ (Resource.wrappedObject(canvas.getContext("2d")));
    3031         this._replayContexts.push({
    3032             type: "2d",
    3033             context: replayContext
    3034         });
    3035         return replayContext;
    30362984    }
    30372985}
Note: See TracChangeset for help on using the changeset viewer.