Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / resources / media / main.js
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 /**
6  * A global object that gets used by the C++ interface.
7  */
8 var media = (function() {
9   'use strict';
10
11   var manager = null;
12
13   // A number->string mapping that is populated through the backend that
14   // describes the phase that the network entity is in.
15   var eventPhases = {};
16
17   // A number->string mapping that is populated through the backend that
18   // describes the type of event sent from the network.
19   var eventTypes = {};
20
21   // A mapping of number->CacheEntry where the number is a unique id for that
22   // network request.
23   var cacheEntries = {};
24
25   // A mapping of url->CacheEntity where the url is the url of the resource.
26   var cacheEntriesByKey = {};
27
28   var requrestURLs = {};
29
30   var media = {
31     BAR_WIDTH: 200,
32     BAR_HEIGHT: 25
33   };
34
35   /**
36    * Users of |media| must call initialize prior to calling other methods.
37    */
38   media.initialize = function(theManager) {
39     manager = theManager;
40   };
41
42   media.onReceiveAudioStreamData = function(audioStreamData) {
43     for (var component in audioStreamData) {
44       media.updateAudioComponent(audioStreamData[component]);
45     }
46   };
47
48   media.onReceiveVideoCaptureCapabilities = function(videoCaptureCapabilities) {
49     manager.updateVideoCaptureCapabilities(videoCaptureCapabilities)
50   }
51
52   media.onReceiveConstants = function(constants) {
53     for (var key in constants.eventTypes) {
54       var value = constants.eventTypes[key];
55       eventTypes[value] = key;
56     }
57
58     for (var key in constants.eventPhases) {
59       var value = constants.eventPhases[key];
60       eventPhases[value] = key;
61     }
62   };
63
64   media.cacheForUrl = function(url) {
65     return cacheEntriesByKey[url];
66   };
67
68   media.onNetUpdate = function(updates) {
69     updates.forEach(function(update) {
70       var id = update.source.id;
71       if (!cacheEntries[id])
72         cacheEntries[id] = new media.CacheEntry;
73
74       switch (eventPhases[update.phase] + '.' + eventTypes[update.type]) {
75         case 'PHASE_BEGIN.DISK_CACHE_ENTRY_IMPL':
76           var key = update.params.key;
77
78           // Merge this source with anything we already know about this key.
79           if (cacheEntriesByKey[key]) {
80             cacheEntriesByKey[key].merge(cacheEntries[id]);
81             cacheEntries[id] = cacheEntriesByKey[key];
82           } else {
83             cacheEntriesByKey[key] = cacheEntries[id];
84           }
85           cacheEntriesByKey[key].key = key;
86           break;
87
88         case 'PHASE_BEGIN.SPARSE_READ':
89           cacheEntries[id].readBytes(update.params.offset,
90                                       update.params.buff_len);
91           cacheEntries[id].sparse = true;
92           break;
93
94         case 'PHASE_BEGIN.SPARSE_WRITE':
95           cacheEntries[id].writeBytes(update.params.offset,
96                                        update.params.buff_len);
97           cacheEntries[id].sparse = true;
98           break;
99
100         case 'PHASE_BEGIN.URL_REQUEST_START_JOB':
101           requrestURLs[update.source.id] = update.params.url;
102           break;
103
104         case 'PHASE_NONE.HTTP_TRANSACTION_READ_RESPONSE_HEADERS':
105           // Record the total size of the file if this was a range request.
106           var range = /content-range:\s*bytes\s*\d+-\d+\/(\d+)/i.exec(
107               update.params.headers);
108           var key = requrestURLs[update.source.id];
109           delete requrestURLs[update.source.id];
110           if (range && key) {
111             if (!cacheEntriesByKey[key]) {
112               cacheEntriesByKey[key] = new media.CacheEntry;
113               cacheEntriesByKey[key].key = key;
114             }
115             cacheEntriesByKey[key].size = range[1];
116           }
117           break;
118       }
119     });
120   };
121
122   media.onRendererTerminated = function(renderId) {
123     util.object.forEach(manager.players_, function(playerInfo, id) {
124       if (playerInfo.properties['render_id'] == renderId) {
125         manager.removePlayer(id);
126       }
127     });
128   };
129
130   media.updateAudioComponent = function(component) {
131     var uniqueComponentId = component.owner_id + ':' + component.component_id;
132     switch (component.status) {
133       case 'closed':
134         manager.removeAudioComponent(
135             component.component_type, uniqueComponentId);
136         break;
137       default:
138         manager.updateAudioComponent(
139             component.component_type, uniqueComponentId, component);
140         break;
141     }
142   };
143
144   media.onPlayerOpen = function(id, timestamp) {
145     manager.addPlayer(id, timestamp);
146   };
147
148   media.onMediaEvent = function(event) {
149     var source = event.renderer + ':' + event.player;
150
151     // Although this gets called on every event, there is nothing we can do
152     // because there is no onOpen event.
153     media.onPlayerOpen(source);
154     manager.updatePlayerInfoNoRecord(
155         source, event.ticksMillis, 'render_id', event.renderer);
156     manager.updatePlayerInfoNoRecord(
157         source, event.ticksMillis, 'player_id', event.player);
158
159     var propertyCount = 0;
160     util.object.forEach(event.params, function(value, key) {
161       key = key.trim();
162
163       // These keys get spammed *a lot*, so put them on the display
164       // but don't log list.
165       if (key === 'buffer_start' ||
166           key === 'buffer_end' ||
167           key === 'buffer_current' ||
168           key === 'is_downloading_data') {
169         manager.updatePlayerInfoNoRecord(
170             source, event.ticksMillis, key, value);
171       } else {
172         manager.updatePlayerInfo(source, event.ticksMillis, key, value);
173       }
174       propertyCount += 1;
175     });
176
177     if (propertyCount === 0) {
178       manager.updatePlayerInfo(
179           source, event.ticksMillis, 'EVENT', event.type);
180     }
181   };
182
183   // |chrome| is not defined during tests.
184   if (window.chrome && window.chrome.send) {
185     chrome.send('getEverything');
186   }
187   return media;
188 }());