15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright (c) 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)'use strict';
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu/**
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * Protocol + host parts of extension URL.
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @type {string}
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @const
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu */
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvar FILE_MANAGER_HOST = 'chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj';
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All of these scripts could be imported with a single call to importScripts,
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but then load and compile time errors would all be reported from the same
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// line.
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuimportScripts(FILE_MANAGER_HOST + '/foreground/js/metadata/metadata_parser.js');
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuimportScripts(FILE_MANAGER_HOST + '/foreground/js/metadata/byte_reader.js');
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuimportScripts(FILE_MANAGER_HOST + '/common/js/util.js');
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dispatches metadata requests to the correct parser.
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Object} port Worker port.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @constructor
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function MetadataDispatcher(port) {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.port_ = port;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.port_.onmessage = this.onMessage.bind(this);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure to update component_extension_resources.grd
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when adding new parsers.
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  importScripts(FILE_MANAGER_HOST + '/foreground/js/metadata/exif_parser.js');
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  importScripts(FILE_MANAGER_HOST + '/foreground/js/metadata/image_parsers.js');
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  importScripts(FILE_MANAGER_HOST + '/foreground/js/metadata/mpeg_parser.js');
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  importScripts(FILE_MANAGER_HOST + '/foreground/js/metadata/id3_parser.js');
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var patterns = [];
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.parserInstances_ = [];
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < MetadataDispatcher.parserClasses_.length; i++) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var parserClass = MetadataDispatcher.parserClasses_[i];
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var parser = new parserClass(this);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.parserInstances_.push(parser);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    patterns.push(parser.urlFilter.source);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.parserRegexp_ = new RegExp('(' + patterns.join('|') + ')', 'i');
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.messageHandlers_ = {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    init: this.init_.bind(this),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request: this.request_.bind(this)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * List of registered parser classes.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.parserClasses_ = [];
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {function} parserClass Parser constructor function.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.registerParserClass = function(parserClass) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MetadataDispatcher.parserClasses_.push(parserClass);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Verbose logging for the dispatcher.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Individual parsers also take this as their default verbosity setting.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.prototype.verbose = false;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * |init| message handler.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.prototype.init_ = function() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inform our owner that we're done initializing.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we need to pass more data back, we can add it to the param array.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.postMessage('initialized', [this.parserRegexp_]);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.log('initialized with URL filter ' + this.parserRegexp_);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * |request| message handler.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} fileURL File URL.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.prototype.request_ = function(fileURL) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  try {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.processOneFile(fileURL, function callback(metadata) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.postMessage('result', [fileURL, metadata]);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }.bind(this));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } catch (ex) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.error(fileURL, ex);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Indicate to the caller that an operation has failed.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * No other messages relating to the failed operation should be sent.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {...Object} var_args Arguments.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.prototype.error = function(var_args) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var ary = Array.apply(null, arguments);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.postMessage('error', ary);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Send a log message to the caller.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Callers must not parse log messages for control flow.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {...Object} var_args Arguments.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.prototype.log = function(var_args) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var ary = Array.apply(null, arguments);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.postMessage('log', ary);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Send a log message to the caller only if this.verbose is true.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {...Object} var_args Arguments.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.prototype.vlog = function(var_args) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (this.verbose)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.log.apply(this, arguments);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Post a properly formatted message to the caller.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} verb Message type descriptor.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Array.<Object>} args Arguments array.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.prototype.postMessage = function(verb, args) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.port_.postMessage({verb: verb, arguments: args});
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Message handler.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Event} event Event object.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.prototype.onMessage = function(event) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var data = event.data;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (this.messageHandlers_.hasOwnProperty(data.verb)) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.messageHandlers_[data.verb].apply(this, data.arguments);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.log('Unknown message from client: ' + data.verb, data);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} fileURL File URL.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {function(Object)} callback Completion callback.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.prototype.processOneFile = function(fileURL, callback) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var self = this;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var currentStep = -1;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function nextStep(var_args) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.vlog('nextStep: ' + steps[currentStep + 1].name);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    steps[++currentStep].apply(self, arguments);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var metadata;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function onError(err, stepName) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.error(fileURL, stepName || steps[currentStep].name, err.toString(),
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        metadata);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var steps =
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [ // Step one, find the parser matching the url.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    function detectFormat() {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i != self.parserInstances_.length; i++) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var parser = self.parserInstances_[i];
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (fileURL.match(parser.urlFilter)) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Create the metadata object as early as possible so that we can
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // pass it with the error message.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          metadata = parser.createDefaultMetadata();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          nextStep(parser);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      onError('unsupported format');
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Step two, turn the url into an entry.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    function getEntry(parser) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webkitResolveLocalFileSystemURL(
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          fileURL,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          function(entry) { nextStep(entry, parser) },
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          onError);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Step three, turn the entry into a file.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    function getFile(entry, parser) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry.file(function(file) { nextStep(file, parser) }, onError);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Step four, parse the file content.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    function parseContent(file, parser) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      metadata.fileSize = file.size;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      try {
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parser.parse(file, metadata, callback, onError);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } catch (e) {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        onError(e.stack);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ];
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nextStep();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Webworker spec says that the worker global object is called self.  That's
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a terrible name since we use it all over the chrome codebase to capture
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the 'this' keyword in lambdas.
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)var global = self;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochif (global.constructor.name == 'SharedWorkerGlobalScope') {
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  global.addEventListener('connect', function(e) {
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var port = e.ports[0];
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new MetadataDispatcher(port);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    port.start();
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  });
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} else {
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Non-shared worker.
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new MetadataDispatcher(global);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
234