├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── app ├── index.html └── main.js ├── index.js ├── package.json ├── src └── package.js ├── template ├── application.ini ├── chrome.manifest ├── chrome │ ├── chrome.manifest │ └── content │ │ ├── app.js │ │ └── main.xul └── defaults │ └── preferences │ └── prefs.js └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Commenting this out is preferred by some people, see 24 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 25 | node_modules 26 | 27 | # Users Environment Variables 28 | .lock-wscript 29 | 30 | # Downloaded runtimes 31 | runtimes 32 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "0.6" 4 | - "0.8" 5 | - "0.10" 6 | - "0.12" 7 | - "4.0" 8 | - "4.1" 9 | - "4.2" 10 | - "iojs" 11 | matrix: 12 | fast_finish: true 13 | allow_failures: 14 | - node_js: "0.6" 15 | - node_js: "0.8" 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Adrián Arroyo Calle 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-xulrunner 2 | ![Travis CI](https://travis-ci.org/AdrianArroyoCalle/node-xulrunner.png) 3 | Like NW.js and node-webkit but with Gecko using XUL Runner. 4 | 5 | Use node.js for your local app and use the magic Node.js powers here. 6 | 7 | ## Usage 8 | 9 | ### Cloning 10 | 11 | This package provides an API and templates. The easyest way to use it is running 12 | ```sh 13 | 14 | git clone http://github.com/AdrianArroyoCalle/node-xulrunner 15 | 16 | ``` 17 | 18 | Then you can put your app in the app/ folder, modify the test.js file and run 19 | 20 | ```sh 21 | 22 | node test.js 23 | 24 | ``` 25 | 26 | ### NPM API 27 | 28 | We also provide an API for future tools like grunt-xulrunner or gulp-xulrunner 29 | 30 | ```sh 31 | 32 | npm install node-xulrunner --save 33 | 34 | ``` 35 | 36 | 37 | ```js 38 | 39 | var xul=require("node-xulrunner"); 40 | 41 | var options={ 42 | os: "linux-i686", 43 | version: "35.0.1", 44 | name: "Testing", 45 | vendor: "Adrián Arroyo", 46 | appVersion: "0.1.0", 47 | buildId: "00000001", 48 | id: "test@node-xulrunner", 49 | copyright: "2015 Adrián Arroyo Calle", 50 | width: 800, 51 | height: 600 52 | }; 53 | 54 | xul.packageApp(options); 55 | 56 | ``` 57 | 58 | But you must provide your own template folder. 59 | 60 | # app/ structure 61 | 62 | app/ is where your app lives. node-xulrunner loads the main.js file and then you have the control. Use Express if you like to serve the HTML pages. 63 | 64 | -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | No se verá 5 | 6 | 7 | 8 |

Testing node-xulrunner

9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/main.js: -------------------------------------------------------------------------------- 1 | var http = require('http'); 2 | http.createServer(function (req, res) { 3 | res.writeHead(200, {'Content-Type': 'text/plain'}); 4 | res.end('Hello World\n'); 5 | }).listen(4200, '127.0.0.1'); 6 | console.log('Server running at http://127.0.0.1:4200/'); 7 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var package=require("./src/package.js"); 2 | 3 | var api={ 4 | packageApp: function(options){ 5 | package(options); 6 | } 7 | }; 8 | 9 | module.exports=api; 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-xulrunner", 3 | "version": "0.1.0", 4 | "description": "Run HTML5 and Node.js applications with Gecko", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "node test.js && node test.js" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/AdrianArroyoCalle/node-xulrunner" 12 | }, 13 | "keywords": [ 14 | "xul", 15 | "xulrunner", 16 | "html5", 17 | "app" 18 | ], 19 | "author": "Adrián Arroyo Calle", 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/AdrianArroyoCalle/node-xulrunner/issues" 23 | }, 24 | "dependencies": { 25 | "bluebird": "^3.0.6", 26 | "decompress": "~2.1.1", 27 | "follow-redirects": "0.2.0", 28 | "fs.extra": "^1.3.2", 29 | "liquid-node": "^2.4.0", 30 | "mkdirp": "~0.5.0", 31 | "mozilla-download": "~1.1.1", 32 | "q": "~1.1.2", 33 | "rimraf": "~2.5.1", 34 | "status-bar": "~2.0.2", 35 | "winston": "~2.2.0" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/package.js: -------------------------------------------------------------------------------- 1 | var mozdownload=require("mozilla-download"); 2 | var Q=require("q"); 3 | var http=require("follow-redirects").http; 4 | var fs=require("fs.extra"); 5 | var mkdirp=require("mkdirp"); 6 | var statusBar=require("status-bar"); 7 | var path = require ("path"); 8 | var Decompress=require("decompress"); 9 | var rimraf=require("rimraf"); 10 | var winston=require("winston"); 11 | var Liquid=require("liquid-node"); 12 | var engine=new Liquid.Engine(); 13 | 14 | 15 | function download(url,dest,callback){ 16 | var file=fs.createWriteStream(dest); 17 | var bar; 18 | var request=http.get(url,function(response){ 19 | bar = statusBar.create ({ total: response.headers["content-length"] }).on ("render", function (stats){ 20 | process.stdout.write ( 21 | path.basename (url) + " " + 22 | this.format.storage (stats.currentSize) + " " + 23 | this.format.speed (stats.speed) + " " + 24 | this.format.time (stats.elapsedTime) + " " + 25 | this.format.time (stats.remainingTime) + " [" + 26 | this.format.progressBar (stats.percentage) + "] " + 27 | this.format.percentage (stats.percentage)); 28 | process.stdout.cursorTo (0); 29 | }); 30 | response.pipe(file); 31 | response.pipe(bar); 32 | response.on("end",callback); 33 | }); 34 | } 35 | 36 | function downloadRuntime(options) { 37 | var url="http://releases.mozilla.org/pub/mozilla.org/xulrunner/releases/"+options.version+"/runtimes/xulrunner-"+options.version+".en-US."+options.os; 38 | if(options.os=="win32") 39 | { 40 | url+=".zip"; 41 | var file=fs.createWriteStream("./runtimes/xul-runner.zip"); 42 | } 43 | else{ 44 | url+=".tar.bz2"; 45 | var file=fs.createWriteStream("./runtimes/xul-runner.tar.bz2"); 46 | } 47 | var defer=Q.defer(); 48 | var bar; 49 | 50 | var request=http.get(url,function(response){ 51 | bar = statusBar.create ({ total: response.headers["content-length"] }).on ("render", function (stats){ 52 | process.stdout.write ( 53 | path.basename (url) + " " + 54 | this.format.storage (stats.currentSize) + " " + 55 | this.format.speed (stats.speed) + " " + 56 | this.format.time (stats.elapsedTime) + " " + 57 | this.format.time (stats.remainingTime) + " [" + 58 | this.format.progressBar (stats.percentage) + "] " + 59 | this.format.percentage (stats.percentage)); 60 | process.stdout.cursorTo (0); 61 | }); 62 | response.pipe(file); 63 | response.pipe(bar); 64 | response.on("end",function(){ 65 | defer.resolve(); 66 | }); 67 | }); 68 | 69 | return defer.promise; 70 | } 71 | 72 | function extractRuntime(options) 73 | { 74 | winston.info("Extracting XUL Runner"); 75 | var deferred=Q.defer(); 76 | if(options.os=="win32") 77 | { 78 | var file="./runtimes/xul-runner.zip"; 79 | var decompress=new Decompress() 80 | .src(file) 81 | .dest("./runtimes/xul-runner") 82 | .use(Decompress.zip({strip: 1})); 83 | decompress.run(function(err,files){ 84 | winston.info("Extracted XUL Runner"); 85 | deferred.resolve(); 86 | }); 87 | } 88 | else 89 | { 90 | var file="./runtimes/xul-runner.tar.bz2"; 91 | var decompress=new Decompress({mode: "777"}) 92 | .src(file) 93 | .dest("./runtimes/xul-runner") 94 | .use(Decompress.tarbz2({strip: 1})); 95 | decompress.run(function(err,files){ 96 | winston.info("Extracted XUL Runner"); 97 | deferred.resolve(); 98 | }); 99 | } 100 | 101 | return deferred.promise; 102 | } 103 | 104 | function downloadNode(options) 105 | { 106 | var defer=Q.defer(); 107 | 108 | switch(options.os){ 109 | case "linux-i686": var url="http://nodejs.org/dist/v0.12.0/node-v0.12.0-linux-x86.tar.gz";break; 110 | case "linux-x86_64": var url="http://nodejs.org/dist/v0.12.0/node-v0.12.0-linux-x64.tar.gz";break; 111 | case "mac": var url="http://nodejs.org/dist/v0.12.0/node-v0.12.0-darwin-x64.tar.gz"; break; 112 | case "win32": var url="http://nodejs.org/dist/v0.12.0/node.exe";break; 113 | } 114 | var bar; 115 | 116 | if(options.os=="win32"){ 117 | var file=fs.createWriteStream("./runtimes/node.exe"); 118 | }else{ 119 | var file=fs.createWriteStream("./runtimes/node.tar.gz"); 120 | } 121 | var request=http.get(url,function(response){ 122 | bar = statusBar.create ({ total: response.headers["content-length"] }).on ("render", function (stats){ 123 | process.stdout.write ( 124 | path.basename (url) + " " + 125 | this.format.storage (stats.currentSize) + " " + 126 | this.format.speed (stats.speed) + " " + 127 | this.format.time (stats.elapsedTime) + " " + 128 | this.format.time (stats.remainingTime) + " [" + 129 | this.format.progressBar (stats.percentage) + "] " + 130 | this.format.percentage (stats.percentage)); 131 | process.stdout.cursorTo (0); 132 | }); 133 | response.pipe(file); 134 | response.pipe(bar); 135 | response.on("end",function(){ 136 | defer.resolve(); 137 | }); 138 | }); 139 | 140 | return defer.promise; 141 | } 142 | function extractNode(options) 143 | { 144 | var deferred=Q.defer(); 145 | winston.info("Extracting Node.js"); 146 | if(options.os=="win32") 147 | { 148 | deferred.resolve(); 149 | }else{ 150 | var file="./runtimes/node.tar.gz"; 151 | var decompress=new Decompress({mode: "777"}) 152 | .src(file) 153 | .dest("./runtimes/node-tmp") 154 | .use(Decompress.targz({strip: 1})); 155 | decompress.run(function(err,files){ 156 | winston.info("Extracted Node.js"); 157 | fs.createReadStream("./runtimes/node-tmp/bin/node").pipe(fs.createWriteStream("./runtimes/node",{mode: 0777})); 158 | rimraf.sync("./runtimes/node-tmp"); 159 | deferred.resolve(); 160 | }); 161 | } 162 | return deferred.promise; 163 | } 164 | 165 | function useTemplate(options) { 166 | winston.info("Using template"); 167 | mkdirp.sync("build"); 168 | var templateOptions={ 169 | name: options.name, 170 | vendor: options.vendor, 171 | version: options.appVersion, 172 | buildid: options.buildId, 173 | id: options.id, 174 | copyright: options.copyright, 175 | width: options.width, 176 | height: options.height 177 | }; 178 | var appIniTemplate=fs.readFileSync("template/application.ini"); 179 | var appIni=fs.createWriteStream("build/application.ini"); 180 | engine.parseAndRender(appIniTemplate,templateOptions) 181 | .then(function(result){ 182 | appIni.on("open",function(){ 183 | appIni.write(result); 184 | appIni.end(); 185 | }); 186 | }); 187 | fs.copy("template/chrome.manifest","build/chrome.manifest"); 188 | fs.copy("template/chrome/chrome.manifest","build/chrome/chrome.manifest"); 189 | mkdirp.sync("build/defaults/preferences"); 190 | fs.copy("template/defaults/preferences/prefs.js","build/defaults/preferences/prefs.js"); 191 | mkdirp.sync("build/chrome/content"); 192 | fs.copy("template/chrome/content/app.js","build/chrome/content/app.js"); 193 | mkdirp.sync("build/chrome/content/runtimes"); 194 | if(options.os!="win32") 195 | fs.copy("runtimes/node","build/chrome/content/runtimes/node",function(){ 196 | fs.chmodSync("build/chrome/content/runtimes/node","777"); 197 | }); 198 | else 199 | fs.copy("runtimes/node.exe","build/chrome/content/runtimes/node.exe"); 200 | fs.copyRecursive("runtimes/xul-runner","build/xulrunner",function(){}); 201 | if(options.os!="win32") 202 | fs.copy("runtimes/xul-runner/xulrunner-stub","build/app",function(){ 203 | fs.chmodSync("build/app","777"); 204 | }); 205 | else 206 | fs.copy("runtimes/xul-runner/xulrunner-stub.exe","build/app.exe"); 207 | fs.copyRecursive("app","build/chrome/content/app",function(){}); 208 | //MAIN.XUL is TEMPLATE 209 | var mainXulTemplate=fs.readFileSync("template/chrome/content/main.xul"); 210 | var mainXul=fs.createWriteStream("build/chrome/content/main.xul"); 211 | engine.parseAndRender(mainXulTemplate,templateOptions) 212 | .then(function(result){ 213 | mainXul.on("open",function(){ 214 | mainXul.write(result); 215 | mainXul.end(); 216 | }); 217 | }); 218 | } 219 | 220 | function packageApp(options) 221 | { 222 | winston.info("Node XULRunner 0.1"); 223 | 224 | fs.exists("./runtimes/ok",function(exist){ 225 | if(exist){ 226 | winston.info("Setup OK"); 227 | useTemplate(options); 228 | }else{ 229 | winston.warn("Creating setup"); 230 | mkdirp.sync("runtimes"); 231 | 232 | Q.fcall(function(){ 233 | return downloadRuntime(options); 234 | }).then(function(){ 235 | return extractRuntime(options); 236 | }).done(); 237 | 238 | Q.fcall(function(){ 239 | return downloadNode(options); 240 | }).then(function(){ 241 | return extractNode(options); 242 | }).done(); 243 | 244 | var ok=fs.createWriteStream("./runtimes/ok"); 245 | ok.on("open",function(fd){ 246 | ok.write("Setup OK\r\n"); 247 | ok.end(); 248 | }); 249 | 250 | } 251 | }); 252 | } 253 | 254 | module.exports=packageApp; 255 | -------------------------------------------------------------------------------- /template/application.ini: -------------------------------------------------------------------------------- 1 | [App] 2 | Vendor={{ vendor }} 3 | Name={{ name }} 4 | Version={{ version }} 5 | BuildID={{ buildid }} 6 | ID={{ id }} 7 | Copyright={{ copyright }} 8 | 9 | [Gecko] 10 | MinVersion=31.* 11 | MaxVersion=900.* 12 | 13 | [XRE] 14 | EnableExtensionManager=0 15 | EnableProfileMigrator=0 16 | 17 | [CrashReporter] 18 | Enabled=False 19 | ServerURL=http://crash-stats.mozilla.com/api/submit 20 | -------------------------------------------------------------------------------- /template/chrome.manifest: -------------------------------------------------------------------------------- 1 | manifest chrome/chrome.manifest 2 | -------------------------------------------------------------------------------- /template/chrome/chrome.manifest: -------------------------------------------------------------------------------- 1 | content node-xulrunner content/ 2 | content branding branding/ 3 | locale branding en-US locale/branding/ 4 | locale node-xulrunner locale/en-US/ 5 | -------------------------------------------------------------------------------- /template/chrome/content/app.js: -------------------------------------------------------------------------------- 1 | /** 2 | app.js - bridge between node and xul 3 | */ 4 | /** 5 | * TODO: 6 | * - Build script with liquid 7 | * - Copy folders 8 | * - Test app 9 | * - Sync Node and XUL 10 | * */ 11 | 12 | function startNode(){ 13 | var FileUtils = Components.utils.import("resource://gre/modules/FileUtils.jsm").FileUtils; 14 | Components.utils.import("resource://gre/modules/Services.jsm"); 15 | //var nsifile = new FileUtils.File("chrome://node-xulrunner/content/app/main.js"); 16 | var file = Services.dirsvc.get("AChrom", Components.interfaces.nsIFile); 17 | file.append("content"); 18 | file.append("runtimes"); 19 | file.append("node"); 20 | var nsifile = Services.dirsvc.get("AChrom", Components.interfaces.nsIFile); 21 | nsifile.append("content"); 22 | nsifile.append("app"); 23 | nsifile.append("main.js"); 24 | var exe = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile); 25 | exe.initWithPath(file.path); 26 | var run = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess); 27 | run.init(exe); 28 | var parameters=[nsifile.path]; 29 | run.runAsync(parameters,parameters.length); 30 | 31 | function QuitObserver() 32 | { 33 | this.register(); 34 | } 35 | QuitObserver.prototype = { 36 | observe: function(subject, topic, data) { 37 | console.log("QUIT"); 38 | run.kill(); 39 | }, 40 | register: function() { 41 | var observerService = Components.classes["@mozilla.org/observer-service;1"] 42 | .getService(Components.interfaces.nsIObserverService); 43 | observerService.addObserver(this, "quit-application", false); 44 | }, 45 | unregister: function() { 46 | var observerService = Components.classes["@mozilla.org/observer-service;1"] 47 | .getService(Components.interfaces.nsIObserverService); 48 | observerService.removeObserver(this, "quit-application"); 49 | } 50 | } 51 | var observer=new QuitObserver(); 52 | } 53 | 54 | function openNodeSite() { 55 | var navigator=document.getElementById("navigator"); 56 | setTimeout(function(){ 57 | navigator.loadURI("http://localhost:4200"); 58 | },5000); 59 | } 60 | -------------------------------------------------------------------------------- /template/chrome/content/main.xul: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /template/defaults/preferences/prefs.js: -------------------------------------------------------------------------------- 1 | pref("toolkit.defaultChromeURI","chrome://node-xulrunner/content/main.xul"); 2 | pref("toolkit.singletonWindowType","xulrunner:app"); 3 | 4 | pref("browser.dom.window.dump.enabled", true); 5 | pref("javascript.options.showInConsole", true); 6 | pref("javascript.options.strict", true); 7 | pref("nglayout.debug.disable_xul_cache", true); 8 | pref("nglayout.debug.disable_xul_fastload", true); 9 | pref("xpinstall.dialog.confirm", "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul"); 10 | pref("xpinstall.dialog.progress.skin", "chrome://mozapps/content/extensions/extensions.xul?type=themes"); 11 | pref("xpinstall.dialog.progress.chrome", "chrome://mozapps/content/extensions/extensions.xul?type=extensions"); 12 | pref("xpinstall.dialog.progress.type.skin", "Extension:Manager-themes"); 13 | pref("xpinstall.dialog.progress.type.chrome", "Extension:Manager-extensions"); 14 | pref("extensions.update.enabled", true); 15 | pref("extensions.update.interval", 86400); 16 | pref("extensions.dss.enabled", false); 17 | pref("extensions.dss.switchPending", false); 18 | pref("extensions.ignoreMTimeChanges", false); 19 | pref("extensions.logging.enabled", false); 20 | pref("general.skins.selectedSkin", "classic/1.0"); //WikiTheme/0.1 for WikiTheme 21 | pref("extensions.update.url", "chrome://mozapps/locale/extensions/extensions.properties"); 22 | pref("extensions.getMoreExtensionsURL", "chrome://mozapps/locale/extensions/extensions.properties"); 23 | pref("extensions.getMoreThemesURL", "chrome://mozapps/locale/extensions/extensions.properties"); 24 | pref("extensions.getAddons.search.url","http://github.com/AdrianArroyoCalle/divwiki/raw/master/extensions/search.xml"); 25 | pref("wiki.extension-manager.uri","chrome://mozapps/content/extensions/extensions.xul"); 26 | pref("wiki.js-console.uri","chrome://global/content/console.xul"); 27 | pref("wiki.config.uri","chrome://global/content/config.xul"); 28 | pref("browser.download.useDownloadDir", true); 29 | pref("browser.download.folderList", 0); 30 | pref("browser.download.manager.showAlertOnComplete", true); 31 | pref("browser.download.manager.showAlertInterval", 2000); 32 | pref("browser.download.manager.retention", 2); 33 | pref("browser.download.manager.showWhenStarting", true); 34 | pref("browser.download.manager.useWindow", true); 35 | pref("browser.download.manager.closeWhenDone", true); 36 | pref("browser.download.manager.openDelay", 0); 37 | pref("browser.download.manager.focusWhenStarting", false); 38 | pref("browser.download.manager.flashCount", 2); 39 | pref("alerts.slideIncrement", 1); 40 | pref("alerts.slideIncrementTime", 10); 41 | pref("alerts.totalOpenTime", 4000); 42 | pref("alerts.height", 50); 43 | pref("signon.rememberSignons", true); 44 | pref("signon.expireMasterPassword", false); 45 | pref("signon.SignonFileName", "signons.txt"); 46 | pref("app.update.enabled", true); 47 | pref("app.update.auto", true); 48 | pref("app.update.mode", 2); 49 | pref("app.update.silent", false); 50 | pref("app.update.url", "https://github.com/AdrianArroyoCalle/divwiki/raw/master/updates.xml"); 51 | pref("app.update.url.manual", "http://github.com/AdrianArroyoCalle/divwiki/releases"); 52 | pref("app.update.url.details", "http://github.com/AdrianArroyoCalle/divwiki"); 53 | pref("app.update.interval", 86400); 54 | pref("app.update.nagTimer.download", 86400); 55 | pref("app.update.nagTimer.restart", 1800); 56 | pref("app.update.timer", 600000); 57 | pref("app.update.showInstalledUI", false); 58 | pref("app.update.incompatible.mode", 0); 59 | pref("browser.preferences.instantApply",false); 60 | pref("browser.preferences.animateFadeIn",false); 61 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | var xul=require("./index.js"); 2 | 3 | var options={ 4 | os: "win32", 5 | version: "35.0.1", 6 | name: "Testing", 7 | vendor: "Adrián Arroyo", 8 | appVersion: "0.1.0", 9 | buildId: "00000001", 10 | id: "test@node-xulrunner", 11 | copyright: "2015 Adrián Arroyo Calle", 12 | width: 800, 13 | height: 600 14 | }; 15 | 16 | xul.packageApp(options); 17 | --------------------------------------------------------------------------------