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