diff -r 000000000000 -r 6474c204b198 b2g/chrome/content/runapp.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/b2g/chrome/content/runapp.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,128 @@ +"use strict"; + +// runapp.js: +// Provide a --runapp APPNAME command-line option. + +let runAppObj; +window.addEventListener('load', function() { + if (!window.arguments) { + return; + } + + // Get the command line arguments that were passed to the b2g client + let args = window.arguments[0].QueryInterface(Ci.nsICommandLine); + let appname; + + // - Check if the argument is present before doing any work. + try { + // Returns null if the argument was not specified. Throws + // NS_ERROR_INVALID_ARG if there is no parameter specified (because + // it was the last argument or the next argument starts with '-'). + // However, someone could still explicitly pass an empty argument! + appname = args.handleFlagWithParam('runapp', false); + } catch(e) { + // treat a missing parameter like an empty parameter (=> show usage) + appname = ''; + } + + // not specified, bail. + if (appname === null) { + return; + } + + runAppObj = new AppRunner(appname); + Services.obs.addObserver(runAppObj, 'browser-ui-startup-complete', false); +}); + +window.addEventListener('unload', function() { + if (runAppObj) { + Services.obs.removeObserver(runAppObj, 'browser-ui-startup-complete'); + } +}); + +function AppRunner(aName) { + this._req = null; + this._appName = aName; +} +AppRunner.prototype = { + observe: function(aSubject, aTopic, aData) { + if (aTopic == 'browser-ui-startup-complete') { + this.doRunApp(); + } + }, + + doRunApp: function() { + // - Get the list of apps since the parameter was specified + this._req = navigator.mozApps.mgmt.getAll(); + this._req.onsuccess = this.getAllSuccess.bind(this); + this._req.onerror = this.getAllError.bind(this); + }, + + getAllSuccess: function() { + let apps = this._req.result; + + function findAppWithName(name) { + let normalizedSearchName = name.replace(/[- ]+/g, '').toLowerCase(); + + for (let i = 0; i < apps.length; i++) { + let app = apps[i]; + let normalizedAppName = + app.manifest.name.replace(/[- ]+/g, '').toLowerCase(); + if (normalizedSearchName === normalizedAppName) { + return app; + } + } + return null; + } + + function usageAndDie(justApps) { + if (!justApps) + dump( + 'The --runapp argument specifies an app to automatically run at\n'+ + 'startup. We match against app names per their manifest and \n' + + 'ignoring capitalization, dashes, and whitespace.\n' + + '\nThe system will load as usual except the lock screen will be ' + + 'automatically be disabled.\n\n' + + 'Known apps:\n'); + + for (let i = 0; i < apps.length; i++) { + dump(' ' + apps[i].manifest.name + '\n'); + } + + // Exit the b2g client + Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit); + } + + if (this._appName === '') { + usageAndDie(); + return; + } + + let app = findAppWithName(this._appName); + if (!app) { + dump('Could not find app: "' + this._appName + '". Maybe you meant one of:\n'); + usageAndDie(true); + return; + } + + let setReq = + navigator.mozSettings.createLock().set({'lockscreen.enabled': false}); + setReq.onsuccess = function() { + // give the event loop 100ms to disable the lock screen + window.setTimeout(function() { + dump('--runapp launching app: ' + app.manifest.name + '\n'); + app.launch(); + }, 100); + }; + setReq.onerror = function() { + dump('--runapp failed to disable lock-screen. Giving up.\n'); + }; + + dump('--runapp found app: ' + app.manifest.name + + ', disabling lock screen...\n'); + }, + + getAllError: function() { + dump('Problem getting the list of all apps!'); + } +};