Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / devtools / front_end / sdk / WorkerManager.js
1 /*
2  * Copyright (C) 2011 Google 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 are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 /**
32  * @constructor
33  * @extends {WebInspector.Object}
34  * @param {boolean} isMainFrontend
35  */
36 WebInspector.WorkerManager = function(target, isMainFrontend)
37 {
38     this._reset();
39     target.registerWorkerDispatcher(new WebInspector.WorkerDispatcher(this));
40     if (isMainFrontend) {
41         WorkerAgent.enable();
42         WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._mainFrameNavigated, this);
43     }
44 }
45
46 WebInspector.WorkerManager.Events = {
47     WorkerAdded: "WorkerAdded",
48     WorkerRemoved: "WorkerRemoved",
49     WorkersCleared: "WorkersCleared",
50     WorkerSelectionChanged: "WorkerSelectionChanged",
51     WorkerDisconnected: "WorkerDisconnected",
52     MessageFromWorker: "MessageFromWorker",
53 }
54
55 WebInspector.WorkerManager.MainThreadId = 0;
56
57 WebInspector.WorkerManager.prototype = {
58
59     _reset: function()
60     {
61         /** @type {!Object.<number, string>} */
62         this._threadUrlByThreadId = {};
63         this._threadUrlByThreadId[WebInspector.WorkerManager.MainThreadId] = WebInspector.UIString("Thread: Main");
64         this._threadsList = [WebInspector.WorkerManager.MainThreadId];
65         this._selectedThreadId = WebInspector.WorkerManager.MainThreadId;
66     },
67
68     _workerCreated: function(workerId, url, inspectorConnected)
69     {
70         this._threadsList.push(workerId);
71         this._threadUrlByThreadId[workerId] = url;
72         this.dispatchEventToListeners(WebInspector.WorkerManager.Events.WorkerAdded, {workerId: workerId, url: url, inspectorConnected: inspectorConnected});
73      },
74
75     _workerTerminated: function(workerId)
76     {
77         this._threadsList.remove(workerId);
78         delete this._threadUrlByThreadId[workerId];
79         this.dispatchEventToListeners(WebInspector.WorkerManager.Events.WorkerRemoved, workerId);
80     },
81
82     _dispatchMessageFromWorker: function(workerId, message)
83     {
84         this.dispatchEventToListeners(WebInspector.WorkerManager.Events.MessageFromWorker, {workerId: workerId, message: message})
85     },
86
87     _disconnectedFromWorker: function()
88     {
89         this.dispatchEventToListeners(WebInspector.WorkerManager.Events.WorkerDisconnected)
90     },
91
92     _mainFrameNavigated: function(event)
93     {
94         this._reset();
95         this.dispatchEventToListeners(WebInspector.WorkerManager.Events.WorkersCleared);
96     },
97
98     /**
99      * @return {!Array.<number>}
100      */
101     threadsList: function()
102     {
103         return this._threadsList;
104     },
105
106     /**
107      * @param {number} threadId
108      * @return {string}
109      */
110     threadUrl: function(threadId)
111     {
112         return this._threadUrlByThreadId[threadId];
113     },
114
115     /**
116      * @param {number} threadId
117      */
118     setSelectedThreadId: function(threadId)
119     {
120         this._selectedThreadId = threadId;
121     },
122
123     /**
124      * @return {number}
125      */
126     selectedThreadId: function()
127     {
128         return this._selectedThreadId;
129     },
130
131     __proto__: WebInspector.Object.prototype
132 }
133
134 /**
135  * @constructor
136  * @implements {WorkerAgent.Dispatcher}
137  */
138 WebInspector.WorkerDispatcher = function(workerManager)
139 {
140     this._workerManager = workerManager;
141 }
142
143 WebInspector.WorkerDispatcher.prototype = {
144
145     workerCreated: function(workerId, url, inspectorConnected)
146     {
147         this._workerManager._workerCreated(workerId, url, inspectorConnected);
148     },
149
150     workerTerminated: function(workerId)
151     {
152         this._workerManager._workerTerminated(workerId);
153     },
154
155     dispatchMessageFromWorker: function(workerId, message)
156     {
157         this._workerManager._dispatchMessageFromWorker(workerId, message);
158     },
159
160     disconnectedFromWorker: function()
161     {
162         this._workerManager._disconnectedFromWorker();
163     }
164 }
165
166 /**
167  * @type {!WebInspector.WorkerManager}
168  */
169 WebInspector.workerManager;
170
171 /**
172  * @constructor
173  * @extends {InspectorBackendClass.Connection}
174  * @param {string} workerId
175  */
176 WebInspector.ExternalWorkerConnection = function(workerId, onConnectionReady)
177 {
178     InspectorBackendClass.Connection.call(this);
179     this._workerId = workerId;
180     window.addEventListener("message", this._processMessage.bind(this), true);
181     onConnectionReady(this);
182 }
183
184 WebInspector.ExternalWorkerConnection.prototype = {
185
186     /**
187      * @param {?Event} event
188      */
189     _processMessage: function(event)
190     {
191         if (!event)
192             return;
193
194         var message = event.data;
195         this.dispatch(message);
196     },
197
198     /**
199      * @param {!Object} messageObject
200      */
201     sendMessage: function(messageObject)
202     {
203         window.opener.postMessage({workerId: this._workerId, command: "sendMessageToBackend", message: messageObject}, "*");
204     },
205
206     __proto__: InspectorBackendClass.Connection.prototype
207 }