mozilla

Compare Revisions

Using HTML5 audio and video Redirect 1

Change Revisions

Revision 338557:

Revision 338557 by teoli on

Revision 351309:

Revision 351309 by ohm_kaka on

Title:
Using HTML5 audio and video Redirect 1
Using HTML5 audio and video Redirect 1
Slug:
Using_HTML5_audio_and_video
Using_HTML5_audio_and_video
Content:

Revision 338557
Revision 351309
tt7    <p>
7    REDIRECT <a class="redirect" href="/en-US/docs/HTML/Using_HTM8      REDIRECT <a class="redirect" href="/en-US/docs/HTML/Using_H
>L5_audio_and_video">Using HTML5 audio and video</a>>TML5_audio_and_video">Using HTML5 audio and video</a>
9    </p>
10    <pre>
11/* vim:set ts=2 sw=2 sts=2 expandtab */
12/* This Source Code Form is subject to the terms of the Mozilla P
 >ublic
13 * License, v. 2.0. If a copy of the MPL was not distributed with
 > this
14 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
15 
16// @see http://mxr.mozilla.org/mozilla-central/source/js/src/xpco
 >nnect/loader/mozJSComponentLoader.cpp
17 
18'use strict';
19 
20// IMPORTANT: Avoid adding any initialization tasks here, if you 
 >need to do
21// something before add-on is loaded consider addon/runner module
 > instead!
22 
23const { classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu,
24        results: Cr, manager: Cm } = Components;
25const ioService = Cc['@mozilla.org/network/io-service;1'].
26                  getService(Ci.nsIIOService);
27const resourceHandler = ioService.getProtocolHandler('resource').
28                        QueryInterface(Ci.nsIResProtocolHandler);
29const systemPrincipal = CC('@mozilla.org/systemprincipal;1', 'nsI
 >Principal')();
30const scriptLoader = Cc['@mozilla.org/moz/jssubscript-loader;1'].
31                     getService(Ci.mozIJSSubScriptLoader);
32 
33const REASON = [ 'unknown', 'startup', 'shutdown', 'enable', 'dis
 >able',
34                 'install', 'uninstall', 'upgrade', 'downgrade' ]
 >;
35 
36let loader = null;
37let unload = null;
38let cuddlefishSandbox = null;
39let nukeTimer = null;
40 
41// Utility function that synchronously reads local resource from 
 >the given
42// `uri` and returns content string.
43function readURI(uri) {
44  let ioservice = Cc['@mozilla.org/network/io-service;1'].
45    getService(Ci.nsIIOService);
46  let channel = ioservice.newChannel(uri, 'UTF-8', null);
47  let stream = channel.open();
48 
49  let cstream = Cc['@mozilla.org/intl/converter-input-stream;1'].
50    createInstance(Ci.nsIConverterInputStream);
51  cstream.init(stream, 'UTF-8', 0, 0);
52 
53  let str = {};
54  let data = '';
55  let read = 0;
56  do {
57    read = cstream.readString(0xffffffff, str);
58    data += str.value;
59  } while (read != 0);
60 
61  cstream.close();
62 
63  return data;
64}
65 
66// Utility function that converts cfx-py generated paths to a
67// module ids.
68function path2id(path) {
69  // Strips out `/lib` and `.js` from package/lib/path.js
70  return path.replace(/([^\/]*)\/lib/, '$1').replace(/.js$/, '');
71}
72// Utility function that takes old manifest format and creates a 
 >manifest
73// in a new format: https://github.com/mozilla/addon-sdk/wiki/JEP
 >-Linker
74function manifestV2(manifest) {
75  return Object.keys(manifest).reduce(function(result, path) {
76    let entry = manifest[path];
77    let id = path2id(path);
78    let requirements = entry.requirements || {};
79    result[id] = {
80      requirements: Object.keys(requirements).reduce(function(res
 >ult, path) {
81        result[path] = path2id(requirements[path].path);
82        return result;
83      }, {})
84    };
85    return result
86  }, {});
87}
88 
89// We don't do anything on install &amp; uninstall yet, but in a 
 >future
90// we should allow add-ons to cleanup after uninstall.
91function install(data, reason) {}
92function uninstall(data, reason) {}
93 
94function startup(data, reasonCode) {
95  try {
96    let reason = REASON[reasonCode];
97    // URI for the root of the XPI file.
98    // 'jar:' URI if the addon is packed, 'file:' URI otherwise.
99    // (Used by l10n module in order to fetch `locale` folder)
100    let rootURI = data.resourceURI.spec;
101 
102    // TODO: Maybe we should perform read harness-options.json as
 >ynchronously,
103    // since we can't do anything until 'sessionstore-windows-res
 >tored' anyway.
104    let options = JSON.parse(readURI(rootURI + './harness-options
 >.json'));
105 
106    let id = options.jetpackID;
107    let name = options.name;
108    // Register a new resource 'domain' for this addon which is m
 >apping to
109    // XPI's `resources` folder.
110    // Generate the domain name by using jetpack ID, which is the
 > extension ID
111    // by stripping common characters that doesn't work as a doma
 >in name:
112    let uuidRe =
113      /^\{([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-
 >f]{12})\}$/;
114 
115    let domain = id.
116      toLowerCase().
117      replace(/@/g, '-at-').
118      replace(/\./g, '-dot-').
119      replace(uuidRe, '$1');
120 
121    let prefixURI = 'resource://' + domain + '/';
122    let resourcesURI = ioService.newURI(rootURI + '/resources/', 
 >null, null);
123    resourceHandler.setSubstitution(domain, resourcesURI);
124 
125    // Create path to URLs mapping supported by loader.
126    let paths = Object.keys(options.metadata).reduce(function(res
 >ult, name) {
127      result[name + '/'] = prefixURI + name + '/lib/'
128      result[name + '/tests/'] = prefixURI + name + '/tests/'
129      return result
130    }, {
131      // Relative modules resolve to add-on package lib
132      './': prefixURI + name + '/lib/',
133      'toolkit/': 'resource://gre/modules/toolkit/',
134      '': 'resources:///modules/'
135    });
136 
137    // Make version 2 of the manifest
138    let manifest = manifestV2(options.manifest);
139 
140    // Import `cuddlefish.js` module using a Sandbox and bootstra
 >p loader.
141    let cuddlefishURI = prefixURI + options.loader;
142    cuddlefishSandbox = loadSandbox(cuddlefishURI);
143    let cuddlefish = cuddlefishSandbox.exports;
144 
145    // Normalize `options.mainPath` so that it looks like one tha
 >t will come
146    // in a new version of linker.
147    let main = path2id(options.mainPath);
148 
149    unload = cuddlefish.unload;
150    loader = cuddlefish.Loader({
151      paths: paths,
152      // modules manifest.
153      manifest: manifest,
154 
155      // Add-on ID used by different APIs as a unique identifier.
156      id: id,
157      // Add-on name.
158      name: name,
159      // Add-on version.
160      version: options.metadata[name].version,
161      // Add-on package descriptor.
162      metadata: options.metadata[name],
163      // Add-on load reason.
164      loadReason: reason,
165 
166      prefixURI: prefixURI,
167      // Add-on URI.
168      rootURI: rootURI,
169      // options used by system module.
170      // File to write 'OK' or 'FAIL' (exit code emulation).
171      resultFile: options.resultFile,
172      // File to write stdout.
173      logFile: options.logFile,
174      // Arguments passed as --static-args
175      staticArgs: options.staticArgs,
176 
177      // Arguments related to test runner.
178      modules: {
179        '@test/options': {
180          allTestModules: options.allTestModules,
181          iterations: options.iterations,
182          filter: options.filter,
183          profileMemory: options.profileMemory,
184          stopOnError: options.stopOnError,
185          verbose: options.verbose,
186        }
187      }
188    });
189 
190    let module = cuddlefish.Module('addon-sdk/sdk/loader/cuddlefi
 >sh', cuddlefishURI);
191    let require = cuddlefish.Require(loader, module);
192 
193    require('sdk/addon/runner').startup(reason, {
194      loader: loader,
195      main: main,
196      prefsURI: rootURI + 'defaults/preferences/prefs.js'
197    });
198  } catch (error) {
199    dump('Bootstrap error: ' + error.message + '\n' +
200         (error.stack || error.fileName + ': ' + error.lineNumber
 >) + '\n');
201    throw error;
202  }
203};
204 
205function loadSandbox(uri) {
206  let proto = {
207    sandboxPrototype: {
208      loadSandbox: loadSandbox,
209      ChromeWorker: ChromeWorker
210    }
211  };
212  let sandbox = Cu.Sandbox(systemPrincipal, proto);
213  // Create a fake commonjs environnement just to enable loading 
 >loader.js
214  // correctly
215  sandbox.exports = {};
216  sandbox.module = { uri: uri, exports: sandbox.exports };
217  sandbox.require = function () {
218    throw new Error("Bootstrap sandbox `require` method isn't imp
 >lemented.");
219  };
220  scriptLoader.loadSubScript(uri, sandbox, 'UTF-8');
221  return sandbox;
222}
223 
224function unloadSandbox(sandbox) {
225  if ("nukeSandbox" in Cu)
226    Cu.nukeSandbox(sandbox);
227}
228 
229function setTimeout(callback, delay) {
230  let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITim
 >er);
231  timer.initWithCallback({ notify: callback }, delay,
232                         Ci.nsITimer.TYPE_ONE_SHOT);
233  return timer;
234}
235 
236function shutdown(data, reasonCode) {
237  let reason = REASON[reasonCode];
238  if (loader) {
239    unload(loader, reason);
240    unload = null;
241    // Avoid leaking all modules when something goes wrong with o
 >ne particular
242    // module. Do not clean it up immediatly in order to allow ex
 >ecuting some
243    // actions on addon disabling.
244    // We need to keep a reference to the timer, otherwise it is 
 >collected
245    // and won't ever fire.
246    nukeTimer = setTimeout(nukeModules, 1000);
247  }
248};
249 
250function nukeModules() {
251  nukeTimer = null;
252  // module objects store `exports` which comes from sandboxes
253  // We should avoid keeping link to these object to avoid leakin
 >g sandboxes
254  for (let key in loader.modules) {
255    delete loader.modules[key];
256  }
257  // Direct links to sandboxes should be removed too
258  for (let key in loader.sandboxes) {
259    let sandbox = loader.sandboxes[key];
260    delete loader.sandboxes[key];
261    // Bug 775067: From FF17 we can kill all CCW from a given san
 >dbox
262    unloadSandbox(sandbox);
263  }
264  loader = null;
265 
266  // Unload sandbox used to evaluate loader.js
267  unloadSandbox(cuddlefishSandbox.loaderSandbox);
268  // Bug 764840: We need to unload cuddlefish otherwise it will s
 >tay alive
269  // and keep a reference to this compartment.
270  unloadSandbox(cuddlefishSandbox);
271  cuddlefishSandbox = null;
272}
273</pre>

Back to History