Web Inspector: We should have a way to capture heap snapshots programatically.
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Workers / HeapSnapshot / HeapSnapshotWorker.js
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 importScripts(...[
27     "HeapSnapshot.js"
28 ]);
29
30 HeapSnapshotWorker = class HeapSnapshotWorker
31 {
32     constructor()
33     {
34         this._nextObjectId = 1;
35         this._objects = new Map;
36
37         self.addEventListener("message", this._handleMessage.bind(this));
38     }
39
40     // Actions
41
42     createSnapshot(snapshotString, title)
43     {
44         let objectId = this._nextObjectId++;
45         let snapshot = new HeapSnapshot(objectId, snapshotString, title);
46         this._objects.set(objectId, snapshot);
47         return {objectId, snapshot: snapshot.serialize()};
48     }
49
50     createSnapshotDiff(objectId1, objectId2)
51     {
52         let snapshot1 = this._objects.get(objectId1);
53         let snapshot2 = this._objects.get(objectId2);
54
55         console.assert(snapshot1 instanceof HeapSnapshot);
56         console.assert(snapshot2 instanceof HeapSnapshot);
57
58         let objectId = this._nextObjectId++;
59         let snapshotDiff = new HeapSnapshotDiff(objectId, snapshot1, snapshot2);
60         this._objects.set(objectId, snapshotDiff);
61         return {objectId, snapshotDiff: snapshotDiff.serialize()};
62     }
63
64     // Public
65
66     sendEvent(eventName, eventData)
67     {
68         self.postMessage({eventName, eventData});
69     }
70
71     // Private
72     
73     _handleMessage(event)
74     {
75         let data = event.data;
76
77         // Action.
78         if (data.actionName) {
79             let result = this[data.actionName](...data.actionArguments);
80             self.postMessage({callId: data.callId, result});
81             return;
82         }
83
84         // Method.
85         if (data.methodName) {
86             console.assert(data.objectId, "Must have an objectId to call the method on");
87             let object = this._objects.get(data.objectId);
88             let result = object[data.methodName](...data.methodArguments);
89             self.postMessage({callId: data.callId, result});
90             return;
91         }
92
93         console.error("Unexpected HeapSnapshotWorker message", data);
94     }
95 };
96
97 self.heapSnapshotWorker = new HeapSnapshotWorker;